HDU 1242

题意:有一个人被困在监狱了,他的朋友想去救他,x代表守卫,a代表这个人,r代表他的朋友,#代表墙,问朋友找他最小的时间,移动一格时间+1,如果那地方是守卫,杀死守卫也需要+1时间;

思路:和HDU 1240差不多,记忆最短路径。

但这题有个坑点,就是他的朋友可能有多个,我读题的时候没看到... 直接超时4发

#include<iostream>
#include<cstdio>
#include<cstring>
#include<climits>
using namespace std;
const int qq=200+5,no=1e7;
char map[qq][qq];
int dis[qq][qq],n,m,minx;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void dfs(int x,int y,int cnt)
{
    if(x<0||y<0||x>=n||y>=m)    return;
    if(map[x][y]=='#')    return;
    if(cnt>=dis[x][y])    return;
    else    dis[x][y]=cnt;    
    if(cnt>=minx)    return;
    if(map[x][y]=='r')    if(cnt<minx)    minx=cnt;
    if(map[x][y]=='x')    ++cnt;
    for(int i=0;i<4;++i)
        dfs(x+dx[i],y+dy[i],cnt+1);
    return;
}
int main()
{
    while(cin >> n >> m){
        int sx,sy;
        for(int j,i=0;i<n;++i)
            for(j=0;j<m;++j){
                cin >> map[i][j];
                if(map[i][j]=='a'){
                    sx=i;sy=j;
                }
                dis[i][j]=no;
            }
    minx=INT_MAX;
    dfs(sx,sy,0);
    if(minx!=INT_MAX)    cout << minx << endl;
    else    cout << "Poor ANGEL has to stay in the prison all his life."  << endl;
    }
}

%*c代表跳过这个变量;

原文地址:https://www.cnblogs.com/sasuke-/p/5137840.html