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代表跳过这个变量;