HDU_1242_Rescue
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1242
大意:迷宫搜索,'#'代表墙,'.'代表路,'x'代表守卫,每移动1格用1秒,杀死守卫用1秒,angel('a'表示)的朋友们(用'r'表示),要去救她,问最短时间为多少?
分析:迷宫搜索,dfs
总结:注意读题,之前做的时候以为只有一个朋友,其实有多个,所以用'a'去找'r'比较方便。注意输入,之前输入也有错误。
代码:
#include<iostream> #include<cstring> #include<cmath> #include<cstdio> using namespace std; #define N 205 #define INF 0x7ffffff int n,m,minx; int ex,ey; char map[N][N]; bool vis[N][N]; int dir[4][2]= {{-1,0},{0,1},{1,0},{0,-1}}; bool inside(int x,int y) { if(x>=0&&x<m&&y>=0&&y<n) return 1; return 0; } void dfs(int x,int y,int time) { if(map[x][y]=='r') { if(time<minx) minx=time; return; } if(map[x][y]=='#') return; if(time>minx) return; if(!inside(x,y)) return; if(vis[x][y]) return; vis[x][y]=1; for(int i=0; i<4; i++) { int mx=x+dir[i][0]; int my=y+dir[i][1]; if(map[mx][my]=='x') dfs(mx,my,time+2); else dfs(mx,my,time+1); } vis[x][y]=0; } int main() { int sx,sy; while(scanf("%d%d",&m,&n)!=EOF) { memset(vis,0,sizeof(vis)); minx=INF; for(int i=0;i<m;i++) scanf("%s",map[i]); for(int i=0; i<m; i++) for(int j=0; j<n; j++) if(map[i][j]=='a') { sx=i; sy=j; } //for(int i=0; i<m; i++) // printf("%s\n",map[i]); dfs(sx,sy,0); if(minx==INF) printf("Poor ANGEL has to stay in the prison all his life.\n"); else printf("%d\n",minx); } return 0; }