题意
给出一个n*m的地图,s:起点,d:终点,x:障碍物,.:可以走的格子
给出一个时间t,求问是否可以恰好用t时间从起点走到终点。走一步为一个时间。
注意:走过的格子不能再走
注意2:是在时间t刚好到达,而不是时间t以内!也就是说可以在地图上绕远,反正就要在时间t到达!
分析
很普通的深搜,但是有2点剪枝:
1.在刚读入数据后剪枝:当可以走的格子本来就比时间t还短时,必然无法在t时间走到终点
1 if (m*n-xx<=t) //xx is the number of ‘X‘ 2 { 3 printf("NO\n"); 4 continue; 5 }
2.在深搜中剪枝:1)当前坐标到终点坐标的最短路如果还比剩余时间大时,必然无法在剩余时间内走到终点
2)当最短路与剩余时间的差为奇数时,也无法到达。因为对于同一起点终点,无论如何绕远,都只会多出奇数步
1 int delta_s=abs(x-tx)+abs(y-ty); 2 int delta_t=t-tt; 3 if (delta_t-delta_s<0 || (delta_t-delta_s)%2==1) return;
因为刚转c++,所以给自己记录一点细节吧:while中的continue是直接跳到while上
这个让我tle了很多次没找到错,无语
Accepted Code
1 /* 2 PROBLEM:hdu1010 3 AUTHER:Nicole Lam 4 MEMO:dfs 5 */ 6 #include<cstdio> 7 #include<algorithm> 8 #include<iostream> 9 using namespace std; 10 11 const int b[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; 12 13 char a[10][10]; 14 int m,n,t,sx,sy,tx,ty,flag,xx; 15 16 void dfs(int x,int y,int tt) 17 { 18 if (flag==1) return; 19 if (tt==t && x==tx && y==ty) 20 { 21 flag=1; 22 return; 23 } 24 if (tt>t || x>n || y>m || x<=0 || y<=0) return; 25 int delta_s=abs(x-tx)+abs(y-ty); 26 int delta_t=t-tt; 27 if (delta_t-delta_s<0 || (delta_t-delta_s)%2==1) return; 28 for (int i=0;i<4;i++) 29 { 30 if (a[x+b[i][0]][y+b[i][1]]!=‘X‘) 31 { 32 a[x+b[i][0]][y+b[i][1]]=‘X‘; 33 dfs(x+b[i][0],y+b[i][1],tt+1); 34 if (flag==1) return; 35 a[x+b[i][0]][y+b[i][1]]=‘.‘; 36 } 37 } 38 return; 39 } 40 41 int main() 42 { 43 cin>>n>>m>>t; 44 while (n!=0 && m!=0 &&t!=0) 45 { 46 xx=0; 47 for (int i=1;i<=n;i++) 48 for (int j=1;j<=m;j++) 49 { 50 cin>>a[i][j]; 51 if (a[i][j]==‘S‘) {sx=i;sy=j;} 52 else if (a[i][j]==‘D‘) {tx=i;ty=j;} 53 else if (a[i][j]==‘X‘) xx++; 54 } 55 if (m*n-xx<=t) 56 { 57 printf("NO\n"); 58 continue; 59 } 60 flag=0; 61 a[sx][sy]=‘X‘; 62 dfs(sx,sy,0); 63 if (flag==1) printf("YES\n"); 64 else printf("NO\n"); 65 cin>>n>>m>>t; 66 } 67 return 0; 68 }
时间: 2024-11-06 23:28:33