标签:
他做了如下假设:
1.迷宫可以看作是长为w,宽为h的网格;
2.机器人每移动一步,需要时间1s,消耗电量0.5格;
3.机器人初始电量为满格4格;
4.每个充电器充电次数不限 (充电时间所需时间忽略不计),机器人可以反复经过一个地方,但是不能走到有障碍的地方,并且一旦机器人电量变为0,它就只能停下来,哪怕这个位置正好有充电器,它也没有足够的电量去执行充电操作;
5.机器人走到迷宫出口,必须至少还有0.5格电量,否则也算没走出出口。
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
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\n", 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!\n");//未找到出口 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 }
标签:
原文地址:http://www.cnblogs.com/wxdjss/p/5697409.html