标签:
该题目用到一定理 :在方格中按四连通方向走,则起点到终点的最短步数与任何路径的步数的奇偶性相同
#include <iostream> #include <cmath> using namespace std; const int SIZE=8; char maze[SIZE][SIZE]; int N,M,T; int sy,sx; int ey,ex; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; bool dfs(int y,int x,int step) { int temp; temp=T-step-abs(y-ey)-abs(x-ex); if(temp<0||temp%2==1) //奇偶剪枝 可以证明:从起点到终点的最短路径步数 { // 与任何路径的步数的奇偶性相同 return false; } if(y==ey&&x==ex&&step==T) { return true; } for(int i=0;i<4;i++) { int ny=y+dy[i]; int nx=x+dx[i]; if(1<=ny&&ny<=N&&1<=nx&&nx<=M&&maze[ny][nx]==‘.‘) { maze[ny][nx]=‘X‘; if(dfs(ny,nx,step+1)==true) { return true; } maze[ny][nx]=‘.‘; //回溯 } } return false; } int main() { while(cin>>N>>M>>T&&N&&M&&T) { for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) { cin>>maze[i][j]; if(maze[i][j]==‘S‘) { sy=i; sx=j; } if(maze[i][j]==‘D‘) { maze[i][j]=‘.‘; ey=i; ex=j; } } if(dfs(sy,sx,0)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/4679763.html