HDU 1010
经典搜索
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int MAX=10; 6 7 int step[MAX][MAX]; 8 char maze[MAX][MAX]; 9 int n,m,t; 10 struct { 11 int i,j; 12 }beg,des; 13 int dir[4][2]={0,1,1,0,0,-1,-1,0}; 14 15 bool ok(int i,int j){ 16 if(i<1||i>n||j<1||j>m||maze[i][j]=='X') 17 return false; 18 return true; 19 } 20 21 bool dfs(int i,int j,int time){ 22 if(time==0&&i==des.i&&j==des.j) return true; 23 else if(time==0) return false; 24 25 int ti,tj; 26 for(int k=0;k<4;k++){ 27 ti=i+dir[k][0]; 28 tj=j+dir[k][1]; 29 if(ok(ti,tj)){ 30 if(time-1<abs(des.i-ti)+abs(des.j-tj)) continue; 31 maze[i][j]='X'; 32 if(dfs(ti,tj,time-1)) return true; 33 maze[i][j]='.'; 34 } 35 } 36 37 return false; 38 } 39 40 int main(){ 41 for(int i=1;i<=7;i++) 42 step[0][i]=i%2; 43 for(int i=1;i<=7;i++){ 44 for(int j=1;j<=7;j++) 45 step[i][j]=step[i-1][j]^1; 46 } 47 while(scanf("%d%d%d",&n,&m,&t)!=EOF){ 48 if(n==0&&m==0&&t==0) break; 49 int cnt=0; 50 for(int i=1;i<=n;i++){ 51 scanf("%s",maze[i]+1); 52 for(int k=1;k<=m;k++){ 53 if(maze[i][k]=='.') cnt++; 54 if(maze[i][k]=='S'){ 55 beg.i=i; beg.j=k; 56 } 57 if(maze[i][k]=='D'){ 58 des.i=i; des.j=k; 59 } 60 } 61 } 62 cnt++; 63 if(cnt<t){ 64 printf("NO\n"); continue; 65 } 66 if(step[beg.i][beg.j]==step[des.i][des.j]&&t%2==1){ 67 printf("NO\n"); continue; 68 } 69 if(step[beg.i][beg.j]!=step[des.i][des.j]&&t%2==0){ 70 printf("NO\n"); continue; 71 } 72 // cout<<"here"<<endl; 73 if(dfs(beg.i,beg.j,t)) 74 printf("YES\n"); 75 else printf("NO\n"); 76 } 77 return 0; 78 }