#include<iostream> using namespace std; #include<string.h> #define max 105 long a[100000],step,sum,n,m,visited[max][max]; long directions[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int mxr; struct map{ int turn; char value; int now;//记录转过几次 }map[max][max]; void DFS(int x,int y) { int i,mx,my; if(map[x][y].value=='r') a[sum++]=step; else if(map[x][y].value!='#') { for(i=0;i<4;i++) { mx=x+directions[i][0]; my=y+directions[i][1]; if(map[mx][my].value!='#'&&mx>=1&&mx<=n&&my>=1&&my<=m&&!visited[mx][my])//不是墙并且没走过 { step++; visited[mx][my]=1; DFS(mx,my); //所以关键要得到值的是递归的这一步 推导的时候让这个的下一个DFS就是到达朋友那点比较好理解为什么后面要还原 visited[mx][my]=0;//这一步的原因,上面DFS进行完后要将状态还原 step--; //下面这些都要还原 } } } } int main() { long i,j,x,y,min; while(cin>>n>>m) { memset(visited,0,sizeof(visited)); sum=0; step=0; min=max; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>map[i][j].value; map[i][j].turn=-1; map[i][j].now=0; } } cin>>mxr; int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; visited[x1][y1]=1; map[x2][y2]='r'; DFS(x,y); if(sum==0) cout<<"Poor ANGEL has to stay in the prison all his life."<<endl; else { for(i=0;i<sum;i++) if(a[i]<min) min=a[i]; cout<<min<<endl; } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。