#include<cstdio> #include<iostream> using namespace std; char maze[9][9]; int n,m,t,flag; int starti,startj,endi,endj; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; void DFS(int px,int py,int time) { if(flag==1) return;; if(px<1||px>n||py<1||py>m||time>t) return; if(px==endi&&py==endj&&time==t) {flag=1;return ;} if(maze[px][py]=='X') return ; for(int i=0;i<4;i++){ maze[px][py]='X'; DFS(px+dir[i][0],py+dir[i][1],time+1); maze[px][py]='.'; if(flag==1) return; } int main(){ while(cin>>n>>m>>t){ if(n==0&&m==0&&t==0) break; int count=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ cin>>maze[i][j]; if(maze[i][j]=='S') { startj=j; starti=i; } if(maze[i][j]=='D'){ endj=j; endi=i; } if(maze[i][j]=='X')count++; } if(n*m-count<t) { cout<<"NO"<<endl; continue; } if((endi+endj+starti+startj+t)%2!=0) { cout<<"NO"<<endl; continue; } flag=0; DFS(starti,startj,0); if(flag==1){ cout<<"YES"<<endl; } else cout<<"NO"<<endl; } return 0; }
DFS :要点 奇偶剪枝 即无论怎么走 总与最短路径相差一个偶数,所以要求步数于最短步数之和肯定为偶;
dfs更深的理解 总要记录每一个走过的点等走完后在撤销,并且是求一个联通路径,记住找到后标记推出不然体现不出dfs与bfs的优势