機器人網店

題目描述:
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 true19   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 }
相關文章
相關標籤/搜索