Algorithm Design——广度优先搜索

  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\n", rec);//如果所用时间小于限时,打印时间
125         else
126             printf_s("-1\n");
127     }
128 
129     return 0;
130 }

 

posted @ 2013-12-01 11:13  yiyi_xuechen  Views(174)  Comments(0)    收藏  举报