标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 89873 Accepted Submission(s): 24438
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char map[8][8]; 6 int m,n,bx,by,ex,ey,step,t,flag; 7 int mov[4][2]={0,1,0,-1,1,0,-1,0}; 8 9 bool can(int x,int y) 10 { 11 if(x<0||x>m-1||y<0||y>n-1||map[x][y]==‘X‘) 12 return false; 13 return true; 14 } 15 void DFS(int x,int y) 16 { 17 18 int xx,yy,i; 19 if(x==ex&&y==ey)//判断是否找到终点 20 { 21 if(step==t) 22 flag=1; 23 return ; 24 } 25 if(step>t) 26 return ; 27 int dis=t-abs(ex-x)-abs(ey-y)-step; 28 if(dis<0||dis&1)//奇偶剪枝 29 return ; 30 if(flag==1) 31 return ;//当初我就是没加这一句,在hduoj上超时了,但是在zoj上能过 32 for(i=0;i<4;i++) 33 { 34 xx=x+mov[i][0]; 35 yy=y+mov[i][1]; 36 if(can(xx,yy)) 37 { 38 step++; 39 map[xx][yy]=‘X‘; 40 DFS(xx,yy); 41 step--; 42 map[xx][yy]=‘.‘; 43 } 44 } 45 } 46 int main() 47 { 48 int i,j; 49 while(scanf("%d%d%d",&m,&n,&t),m||n||t) 50 { 51 getchar();//吸收回车符 52 for(i=0;i<m;i++) 53 { 54 for(j=0;j<n;j++) 55 { 56 scanf("%c",&map[i][j]); 57 if(map[i][j]==‘S‘) 58 { 59 bx=i; 60 by=j; 61 } 62 if(map[i][j]==‘D‘) 63 { 64 ex=i; 65 ey=j; 66 } 67 } 68 getchar(); 69 } 70 flag=0; 71 step=0; 72 int best=abs(ex-bx)+abs(ey-by); 73 if((best+t)&1)//首先判断一下,如果最短路径和要走的步数奇偶性不同,就直接输出NO 74 { 75 printf("NO\n"); 76 continue; 77 } 78 map[bx][by]=‘X‘; 79 DFS(bx,by);//深搜 80 if(flag) 81 printf("YES\n"); 82 else 83 printf("NO\n"); 84 } 85 return 0; 86 }
下面看下修剪前后的时间差距
Tempter of the Bone--hdu1010--zoj2110
标签:
原文地址:http://www.cnblogs.com/Eric-keke/p/4715337.html