他作了以下假設:佈局
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 }