洛谷P1126 機械人搬重物

2021-09-12 17:45:58 字數 1925 閱讀 7696

機械人移動學會(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 的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方...