题目描述:
ID为TMao的淘宝用户前些日子在淘宝机器人网店购买了一个智能机器人oz.这个机器人不仅精致小巧,还具有很多有意思的功能。比如:oz可以在迷宫里自由的上下左右走动; 并且,在不碰到障碍物的情况下,它能够以最短时间从入口处走到出口 (假设存在的话); 最智能的是,在有充电器的地方oz还可以给自己充电 (^_^)。
现在,TMao设计了很多种迷宫,并且在里面随意的摆了些充电器,想请你们帮他算下,这个智能机器人要多久时间可以走出去呢?
他做了如下假设:
1.迷宫可以看作是长为w,宽为h的网格;
2.机器人每移动一步,需要时间1s,消耗电量0.5格;
3.机器人初始电量为满格4格;
4.每个充电器充电次数不限 (充电时间所需时间忽略不计),机器人可以反复经过一个地方,但是不能走到有障碍的地方,并且一旦机器人电量变为0,它就只能停下来,哪怕这个位置正好有充电器,它也没有足够的电量去执行充电操作;
5.机器人走到迷宫出口,必须至少还有0.5格电量,否则也算没走出出口。
输入:
输入有多组测试案例,每个测试案例以如下形式输入。第一行输入w,h分别表示迷宫的长和宽,当输入0 0时结束输入(w , h <= 10)。
接下来的h行表示迷宫的布局:-1表示该位置是障碍物, 0表示该位置什么也没有,1表示迷宫入口, 2表示迷宫出口, 3表示该位置有充电器。
- 输出:
- 对应每个测试案例,输出机器人oz走到出口处的时间;如果无法按要求走到出口则输出”Pity oz!”。
- 样例输入:
-
4 3 2 0 0 0 0 0 0 0 0 0 0 1 4 3 2 -1 0 0 -1 0 0 0 3 0 0 1 0 0
样例输出:
5
Pity oz!
参考代码:
1 #include<queue> 2 #include<algorithm> 3 #include<stdio.h> 4 #include<string.h> 5 using namespace std; 6 int w, h, m, n;//w矩阵行,h为矩阵列 7 int a[11][11];//用来分配最大内存矩阵空间 8 int v[11][11][9];//用来标记机器人所处位置对于的电量 9 int s[4][2] ={{ 1, 0 },{ -1, 0 },{ 0, 1 },{ 0, -1 } };//机器人移动方向“上下左右” 10 struct robot//x,y为横纵坐标,l为长度,e为电量 11 { 12 int x, y, l, e; 13 }; 14 //判断当前点是否是障碍 15 bool judge(int x, int y) 16 { 17 if (x >= 1 && x <= h && y >= 1 && y <= w && a[x][y] != -1) 18 return true; 19 return false; 20 } 21 void bfs()//深度遍历 22 { 23 robot k, t; 24 int i, x, y; 25 //初始时机器人的状态 26 k.x = m; 27 k.y = n; 28 k.l = 0; 29 k.e = 8; 30 queue<robot> Q; 31 Q.push(k);//入队 32 memset(v, 0, sizeof(v)); 33 v[m][n][8] = 1; 34 while (!Q.empty()) 35 { 36 k = Q.front();//取队头部数据 37 Q.pop();//出队 38 for (i = 0; i < 4; i++)//沿四个方向遍历 39 { 40 x = k.x + s[i][0]; 41 y = k.y + s[i][1]; 42 if (judge(x, y) && k.e > 1)//当前结点合法,且机器电量充足 43 { 44 t.x = x; 45 t.y = y; 46 t.e = 8; 47 t.l = k.l + 1;//遍历路径加1 48 if (a[x][y] == 2)//找到出口,结束遍历 49 {printf("%d ", k.l + 1);return; } 50 else if (a[x][y] == 3 && !v[x][y][8])//找到充电器处,如果电量不满,进行充电 51 {v[x][y][8] = 1; Q.push(t);} 52 else if (a[x][y] == 0 && !v[x][y][k.e - 1])//如果是未经过路径,电量减1,同时标记该结点。 53 { v[x][y][k.e - 1] = 1; t.e = k.e - 1; Q.push(t);} 54 } 55 } 56 } 57 printf("Pity oz! ");//未找到出口 58 } 59 60 void main() 61 { 62 int i, j; 63 while (scanf("%d%d", &w, &h)==2) 64 { 65 if (!w && !h) return; 66 for (i = 1; i <= h; i++) 67 for (j = 1; j <= w; j++) 68 { 69 scanf("%d", &a[i][j]); 70 if (a[i][j] == 1) 71 { m = i; n = j; } 72 } 73 bfs(); 74 } 75 }