#include<cstdio> #include<cmath> #include<stdlib.h> int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}},escape,n,m,t,si,sj,ei,ej; char a[10][10]; void dfs(int si,int sj,int cnt) { if(si<0||si>=n||sj<0||sj>=m) return ; if(si==ei&&sj==ej&&cnt==t) { escape=1; return; } int temp=t-cnt-abs(ei-si)-abs(ej-sj); if(temp<0||temp%2) return ; for(int i=0;i<4;i++) { if(a[si+dir[i][0]][sj+dir[i][1]]!='X') { a[si+dir[i][0]][sj+dir[i][1]]='X'; dfs(si+dir[i][0],sj+dir[i][1],cnt+1); if(escape) return; a[si+dir[i][0]][sj+dir[i][1]]='.'; } } return; } int main() { int wall=0; while(scanf("%d%d%d",&n,&m,&t)) { wall=0; escape=0; if(n==0&&m==0&&t==0) break; getchar(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='S') { si=i; sj=j; } if(a[i][j]=='X') wall++; if(a[i][j]=='D') { ei=i; ej=j; } } getchar(); } if(n*m-wall<=t) { printf("NO "); continue; } a[si][sj]='X'; dfs(si,sj,0); if(escape) printf("YES "); else printf("NO "); } return 0; }
正式开始学习和练习DFS、BFS,先从这DFS道中最入门的题开始。
关键:剪枝。