機械人移動學會(rmi)現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑$1.6公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個n×m的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受的指令有:向前移動1步(creep);向前移動2步(walk);向前移動3步(run);向左轉(left);向右轉(right)。每個指令所需要的時間為1秒。請你計算一下機械人完成任務所需的最少時間。
現在有乙個儲藏室,如下圖所示,該機械人當前的方向是向下。要從a1移動到a2。
首先我們發現這個機械人走路是只能走頂點的路,所以我們要修改這個儲藏室,修改後如下所示
現在我們將原本的走格仔,轉成成走頂點,這樣子更容易來理解這個題目。
由於這邊要求的是從起點到終點的最少時間,一開始想的就是直接用寬度優先搜尋求最短路徑即可,後面發現,有可能最短路徑所花費的時間不是最少。我來舉例一下。
第一種情況,從起點往上走,經過10個點,但是經過計算,這條路所花費的時間是13。
第二種情況,從起點往下走,經過13個點,但是所花費的時間是12。
經過分析發現,花費時間的多與少,除了與路徑長度有關,還和轉彎的次數有關,並且在轉彎的情況中,如果是掉頭,需要2個時間點,如果只是向左或向走,則只需要乙個時間點。
所以我們可以這樣考慮,還是可以用寬度優先搜尋,但是我們要把從起點到頂點所有路徑找出來,依次比較哪一條路徑所花費的時間最少。
寬度優先搜尋可以用佇列來實現。
#include#include#include#includeconst int size = 55;
using namespace std;
struct node;
queueq;
int map[size][size];
int vis[size][size];
int dx = ;
int dy = ;
int minn = int_max;
char d;
node node;
node newnode;
int startx,starty,endx,endy,tmp,n,m;
int main()}}
n++;m++;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
cin >> startx >> starty >> endx >> endy >> d;
startx++;starty++;endx++;endy++;
node.x = startx;
node.y = starty;
node.step = 0;
if(d == 'e')else if(d == 'w')else if(d == 's')else
q.push(node);
memset(vis,1,sizeof(vis));
while(!q.empty())
}for(int i = 0; i <= 3; i++)
}for(int j = 1; j <= 3; j ++)
if(map[cx][cy])
if(vis[cx][cy] > step)}}
q.pop();
}if(minn < int_max)else
return 0;
}
洛谷P1126 機械人搬重物
機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑1.6公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個n m的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受的指令有 向前移動1...
洛谷P1126 機械人搬重物
機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑 1.6 公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個 n m 的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受的指令有 向...
P1126機械人搬重物 洛谷
機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑 1.6 公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個 n mn times mn m 的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方...