hdu 1253 胜利大逃亡
这是我第二次写这个程序,复习了一下BFS,发现自己已经很不熟练,需要多加练习,自己最近会多多复习的。加油!
Problem Description
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.
魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
![](http://acm.hdu.edu.cn/data/images/c15-1003-1.jpg)
魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
![](http://acm.hdu.edu.cn/data/images/c15-1003-1.jpg)
Input
输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.(如果对输入描述不清楚,可以参考Sample Input中的迷宫描述,它表示的就是上图中的迷宫)
特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.
特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.
Output
对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.
Sample Input
1 3 3 4 20 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0
Sample Output
11
Author
Ignatius.L
Recommend
Ignatius.L
这是没减枝之前的情况:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //This program is written for the second time.I know I still have a lot to accomplish,but I will not 2 //give up.Come on! 3 //Keep working!And I will become a grear programmer too. 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #define MAX 100 9 10 struct queue{ 11 int x,y,z,steps; 12 }que[MAX*MAX*MAX*2+1]; 13 int map[MAX+2][MAX+2][MAX+2]; 14 int di[][3]={1,0,0,0,1,0,0,0,1,-1,0,0,0,-1,0,0,0,-1}; 15 int BFS(); 16 int inmap(int ax,int by,int cz); 17 int a,b,c,T; 18 19 int BFS() 20 { 21 int i,j,tx,ty,tz,front=0,rear=1; 22 que[0].x=1,que[0].y=1,que[0].z=1,que[0].steps=0; 23 map[0][0][0]=1; 24 while(front<rear) 25 { 26 if(que[front].x == a && que[front].y== b && que[front].z== c) 27 { 28 /*if(que[front].steps <= T) 29 printf("%d\n",que[front].steps); 30 else 31 printf("-1\n");*/ 32 return que[front].steps; 33 } 34 for(i=0;i<6;i++) 35 { 36 tx=que[front].x+di[i][0],ty=que[front].y+di[i][1],tz=que[front].z+di[i][2]; 37 if(inmap(tx,ty,tz) && !map[tx][ty][tz]) 38 { 39 map[tx][ty][tz]=1; 40 que[rear].x=tx,que[rear].y=ty,que[rear].z=tz; 41 que[rear++].steps=que[front].steps+1; 42 } 43 } 44 front++; 45 } 46 return -1; 47 } 48 49 int inmap(int ax,int by,int cz) 50 { 51 if(ax>0 && ax <= a && by >0 && by <=b && cz>0 && cz <= c) 52 return 1; 53 else 54 return 0; 55 } 56 57 int main() 58 { 59 int cases,judge; 60 int i,j,k; 61 scanf("%d",&cases); 62 while(cases--) 63 { 64 memset(map,0,sizeof(map)); 65 scanf("%d%d%d%d",&a,&b,&c,&T); 66 for(i=1;i<=a;i++) 67 { 68 for(j=1;j<=b;j++) 69 { 70 for(k=1;k<=c;k++) 71 scanf("%d",&map[i][j][k]); 72 } 73 } 74 /*if(a+b+c-3 > T) 75 printf("-1\n"); 76 else{*/ 77 judge=BFS(); 78 if(judge == -1) 79 printf("-1\n"); 80 else 81 if(judge <= T) 82 printf("%d\n",judge); 83 else 84 printf("-1\n"); 85 /*}*/ 86 } 87 return 0; 88 }
剪枝之后:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //This program is written for the second time.I know I still have a lot to accomplish,but I will not 2 //give up.Come on! 3 //Keep working!And I will become a grear programmer too. 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #define MAX 100 9 10 struct queue{ 11 int x,y,z,steps; 12 }que[MAX*MAX*MAX*2+1]; 13 int map[MAX+2][MAX+2][MAX+2]; 14 int di[][3]={1,0,0,0,1,0,0,0,1,-1,0,0,0,-1,0,0,0,-1}; 15 int BFS(); 16 int inmap(int ax,int by,int cz); 17 int a,b,c,T; 18 19 int BFS() 20 { 21 int i,j,tx,ty,tz,front=0,rear=1; 22 que[0].x=1,que[0].y=1,que[0].z=1,que[0].steps=0; 23 map[0][0][0]=1; 24 while(front<rear) 25 { 26 if(que[front].x == a && que[front].y== b && que[front].z== c) 27 { 28 /*if(que[front].steps <= T) 29 printf("%d\n",que[front].steps); 30 else 31 printf("-1\n");*/ 32 return que[front].steps; 33 } 34 for(i=0;i<6;i++) 35 { 36 tx=que[front].x+di[i][0],ty=que[front].y+di[i][1],tz=que[front].z+di[i][2]; 37 if(inmap(tx,ty,tz) && !map[tx][ty][tz]) 38 { 39 map[tx][ty][tz]=1; 40 que[rear].x=tx,que[rear].y=ty,que[rear].z=tz; 41 que[rear++].steps=que[front].steps+1; 42 } 43 } 44 front++; 45 } 46 return -1; 47 } 48 49 int inmap(int ax,int by,int cz) 50 { 51 if(ax>0 && ax <= a && by >0 && by <=b && cz>0 && cz <= c) 52 return 1; 53 else 54 return 0; 55 } 56 57 int main() 58 { 59 int cases,judge; 60 int i,j,k; 61 scanf("%d",&cases); 62 while(cases--) 63 { 64 memset(map,0,sizeof(map)); 65 scanf("%d%d%d%d",&a,&b,&c,&T); 66 for(i=1;i<=a;i++) 67 { 68 for(j=1;j<=b;j++) 69 { 70 for(k=1;k<=c;k++) 71 scanf("%d",&map[i][j][k]); 72 } 73 } 74 if(a+b+c-3 > T) 75 printf("-1\n"); 76 else{ 77 judge=BFS(); 78 if(judge == -1) 79 printf("-1\n"); 80 else 81 if(judge <= T) 82 printf("%d\n",judge); 83 else 84 printf("-1\n"); 85 } 86 } 87 return 0; 88 }
剪枝前后时间对比:
5949543 | 2012-05-15 22:46:15 | Accepted | 1253 | 546MS | 4396K | 1752 B | C | Kirk Gong |
5949542 | 2012-05-15 22:45:53 | Presentation Error | 1001 | 0MS | 188K | 134B | C | 雨林 |
5949541 | 2012-05-15 22:45:32 | Accepted | 1089 | 0MS | 284K | 151B | C++ | syhjh |
5949540 | 2012-05-15 22:45:25 | Accepted | 2012 | 0MS | 204K | 376B | C | hncu1106402_29 |
5949539 | 2012-05-15 22:45:25 | Accepted | 1507 | 31MS | 544K | 3587B | C++ | 猜猜我是谁 |
5949538 | 2012-05-15 22:45:20 | Runtime Error (ACCESS_VIOLATION) |
2023 | 15MS | 220K | 954B | C | 龍 |
5949537 | 2012-05-15 22:45:12 | Accepted | 1253 | 843MS | 6316K | 1745 B | C | Kirk Gong |
剪枝一定要注意!