http://acm.hdu.edu.cn/showproblem.php?pid=1010
题目大意从S出发,问能否在时间t的时候到达终点D,X为障碍
需要注意的是要恰好在t时刻到达,而不是在t时间之内
深搜,注意剪枝 剩下格子大于t时间的时候剪掉这个很好想,但还是会超时,还有一个剪枝是依靠
奇偶性剪枝
比如地图依靠奇偶性是;
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1 可以发现偶数走一步一定到奇数,奇数走一步一定到偶数,所以当所在地的奇偶性与目的地D不一样的时候
一定走奇数步子,一样就走偶数步,判断这个来剪枝
code
1 #include <stdio.h> 2 #include <stdlib.h> 3 bool flag; 4 int n,m,t,i,j,x1,y1,x2,y2,num; 5 int dix[]={1,0,0,-1}; 6 int diy[]={0,1,-1,0}; 7 char str[8][8]; 8 void DFS(int k,int l,int tc) 9 { 10 int i; 11 if(tc==t && k==x2 &&l==y2) 12 flag=true; 13 if(flag==true) return; 14 if (abs(x2-k)+abs(y2-l)>t-tc)return ; //两个回溯 15 if((abs(x2-k)+abs(y2-l))%2!=(t-tc)%2) return; 16 for(i=0;i<4;i++) 17 { 18 int dx=k+dix[i]; 19 int dy=l+diy[i]; 20 if(dx>=0 && dx<n && dy>=0 && dy<m && str[dx][dy]!='X') 21 { 22 str[dx][dy]='X'; 23 DFS(dx,dy,tc+1); 24 str[dx][dy]='.'; 25 } 26 } 27 } 28 int main() 29 { 30 while (scanf("%d %d %d",&n,&m,&t)) 31 { 32 getchar(); 33 if(n==0&&m==0&&t==0) 34 break; 35 num=0; 36 flag=false; 37 for(i=0;i<n;i++) 38 { 39 for(j=0;j<m;j++) 40 { 41 scanf("%c",&str[i][j]); 42 if(str[i][j]=='S') 43 { 44 x1=i;y1=j; 45 } 46 else if(str[i][j]=='D') 47 { 48 x2=i;y2=j; 49 num++; 50 } 51 else if(str[i][j]=='.') 52 { 53 num++; 54 } 55 } 56 getchar(); 57 } 58 str[x1][y1]='X'; 59 if(num>=t) 60 DFS(x1,y1,0); 61 if(flag==true) 62 printf("YES\n"); 63 else 64 printf("NO\n"); 65 } 66 return 0; 67 }