1 /** 2 题目描述: Ignatius 被魔王抓走了,有一天魔王出差去了,这可是 Ignatius 逃亡的好机会. 3 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩 阵,刚开始 4 Ignatius 被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现 在知道魔王将 5 在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个 坐标中的其中一个. 6 现在给你城堡的地图,请你计算出 Ignatius 能否在魔王回来前 离开城堡 7 (只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃 8 亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1。 9 10 输入: 11 输入数据的第一行是一个正整数 K,表明测试数据的数量.每组测试数据的第一行是四个正 12 整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的 13 时间.然后是 A 块输入数据(先是第 0 块,然后是第 1 块,第 2 块......),每块输入数据有B行, 14 每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙。 15 16 输出: 17 对于每组测试数据,如果 Ignatius 能够在魔王回来前离开城堡,那么请输出他最少需要 18 多少分钟,否则输出-1. 19 20 样例输入: 21 1 22 3 3 4 20 23 0 1 1 1 24 0 0 1 1 25 0 1 1 1 26 1 1 1 1 27 1 0 0 1 28 0 1 1 1 29 0 0 0 0 30 0 1 1 0 31 0 1 1 0 32 */ 33 #include<cstdio> 34 #include<queue> 35 using namespace std; 36 37 bool mark[50][50][50];//标记数组 38 int maze[50][50][50];//存储立方体信息 39 struct N//状态结构体 40 { 41 int x, y, z; 42 int t; 43 }; 44 45 queue<N> Q;//队列,队列中的元素是状态 46 int go[][3] = 47 { 48 1, 0, 0, 49 -1, 0, 0, 50 0, 1, 0, 51 0, -1, 0, 52 0, 0, 1, 53 0, 0, -1 54 }; 55 56 //广度优先搜索,返回其最少耗时 57 int BFS(int a, int b, int c) 58 { 59 while(Q.empty() == false)//当队列中仍有元素可以扩展时循环 60 { 61 N now = Q.front();//得到队头状态 62 Q.pop();//弹出队头状态 63 64 for(int i = 0 ; i < 6 ; i ++)//以此扩展其留个相邻节点 65 { 66 int nx = now.x + go[i][0]; 67 int ny = now.y + go[i][1]; 68 int nz = now.z + go[i][2]; 69 70 if(nx < 0 || nx >= a || ny < 0 || ny >= b || nz < 0 || nz >= c)//越界 71 continue; 72 73 if(maze[nx][ny][nz] == 1)//路障 74 continue; 75 76 if(mark[nx][ny][nz] == true)//已走过 77 continue; 78 79 N tmp;//新状态 80 tmp.x = nx; 81 tmp.y = ny; 82 tmp.z = nz; 83 tmp.t = now.t + 1;//时间+1 84 Q.push(tmp); 85 mark[nx][ny][nz] = true;//标记该点 86 if(nx == a - 1 && ny == b - 1 && nz == c - 1)//走到终点,返回耗时 87 return tmp.t; 88 } 89 } 90 91 return -1; 92 } 93 94 int main() 95 { 96 int T; 97 scanf_s("%d", &T);//测试样例的个数 98 while(T --) 99 { 100 int a, b, c, t; 101 scanf_s("%d%d%d%d", &a, &b, &c, &t);//迷宫大小以及限时 102 for(int i = 0 ; i < a ; i ++) 103 { 104 for(int j = 0 ; j < b ; j ++) 105 { 106 for(int k = 0 ; k < c ; k ++) 107 { 108 scanf_s("%d", &maze[i][j][k]);//迷宫输入 109 mark[i][j][k] = false; 110 } 111 } 112 } 113 114 while(Q.empty() == false)//清除上次痕迹 115 Q.pop(); 116 117 mark[0][0][0] = true; 118 N tmp; 119 tmp.t = tmp.x = tmp.y = tmp.z = 0;//初始状态 120 Q.push(tmp);//将初始状态放入队列 121 int rec = BFS(a, b, c);//广度优先搜索 122 123 if(rec <= t) 124 printf_s("%d ", rec);//如果所用时间小于限时,打印时间 125 else 126 printf_s("-1 "); 127 } 128 129 return 0; 130 }