Tempter of the Bone HDU - 1010
Tempter of the Bone HDU - 1010
dfs。
几个剪枝:
1.如果当前所用时间加上当前位置到目标的曼哈顿距离之和大于目标时间,那么显然无论如何不能完成。剪掉
2.在搜索前判一下,如果出发位置到目标的曼哈顿距离与目标时间的奇偶性不同,那么显然无论如何不能完成。剪掉
错误原因:未加第二个剪枝,TLE
1 #include<cstdio> 2 char s[10][10]; 3 bool ok; 4 int n,m,t,tx,ty,sx,sy; 5 int abs(int x) 6 { 7 return x>0?x:-x; 8 } 9 void dfs(int x,int y,int num) 10 { 11 if(num>t) return; 12 if(abs(tx-x)+abs(ty-y)+num>t) return; 13 if(x==tx&&y==ty) 14 { 15 if(num==t) 16 { 17 puts("YES"); 18 ok=1; 19 } 20 return; 21 } 22 s[x][y]='X'; 23 if(x>1&&s[x-1][y]=='.') dfs(x-1,y,num+1); 24 if(ok) return; 25 if(x<n&&s[x+1][y]=='.') dfs(x+1,y,num+1); 26 if(ok) return; 27 if(y>1&&s[x][y-1]=='.') dfs(x,y-1,num+1); 28 if(ok) return; 29 if(y<m&&s[x][y+1]=='.') dfs(x,y+1,num+1); 30 if(ok) return; 31 s[x][y]='.'; 32 } 33 int main() 34 { 35 int i,j; 36 scanf("%d%d%d",&n,&m,&t); 37 while(n!=0&&m!=0&&t!=0) 38 { 39 ok=false; 40 for(i=1;i<=n;i++) 41 scanf("%s",s[i]+1); 42 for(i=1;i<=n;i++) 43 for(j=1;j<=m;j++) 44 { 45 if(s[i][j]=='S') 46 { 47 sx=i;sy=j; 48 s[i][j]='.'; 49 } 50 else if(s[i][j]=='D') 51 { 52 tx=i;ty=j; 53 s[i][j]='.'; 54 } 55 } 56 if((abs(tx-sx)+abs(ty-sy)-t)%2==0) 57 dfs(sx,sy,0); 58 if(!ok) 59 puts("NO"); 60 scanf("%d%d%d",&n,&m,&t); 61 } 62 return 0; 63 }