廣度搜尋 機械人搬重物

2021-10-02 15:36:06 字數 1911 閱讀 4773

題目

機械人移動學會(rmi)現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑1.6公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個n×m的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受的指令有:向前移動1步(creep);向前移動2步(walk);向前移動3步(run);向左轉(left);向右轉(right)。每個指令所需要的時間為1 秒。請你計算一下機械人完成任務所需的最少時間。

第一行為兩個正整數n,m(n,m≤50),下面n行是儲藏室的構造,0表示無障礙,1表示有障礙,數字之間用乙個空格隔開。接著一行有4個整數和1個大寫字母,分別為起始點和目標點左上角網格的行與列,起始時的面對方向(東e,南s,西w,北n),數與數,數與字母之間均用乙個空格隔開。終點的面向方向是任意的。

乙個整數,表示機械人完成任務所需的最少時間。如果無法到達,輸出−1。

輸入 #1 複製

9 10

0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 0 1 0

0 0 0 1 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 1 1 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0 1 0

7 2 2 7 s

輸出 #1 複製

我們假設從地圖(1,1)開始輸入地圖各個座標, ----注意,不能走到n 或 m 會出邊界;

輸入點為1時,就把這個點的上下左右都標記為1,表示乙個黑格

當機械人紅心點 為1時,表示不能走,撞牆了。

其他在**裡標註了。

#include#include#includeusing namespace std;

const int max_n = 55;

int n,m;

bool mp[max_n][max_n];

bool vis[max_n][max_n][4];

int xx=;

int yy=;

int sx,sy,tx,ty;

struct data;

bool in(int x,int y)

data m1 = m;

m1.s ++;

m1.d = (m1.d+1)%4; //e 左 //每次 轉向 就是 +幾 mod 4

if(!vis[m1.x][m1.y][m1.d]) q.push(m1);

m1.d = (m1.d+2)%4; //w 右 //左加 2 相當於轉180 就是右

if(!vis[m1.x][m1.y][m1.d]) q.push(m1); //只有左右,沒有後,後就得走兩次左或右了

//走一步

m1.d = m.d;

m1.x = m1.x + xx[m1.d];

m1.y = m1.y + yy[m1.d];

if(in(m1.x,m1.y) && !vis[m1.x][m1.y][m1.d] && !mp[m1.x][m1.y])

}} q.pop();

} cout<

return 0;

}

機械人搬重物

時間限制 1 sec 記憶體限制 128 mb 提交 28 解決 13 提交 狀態 討論版 機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑1.6公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個n m的網格,有些格仔為不可移動的障礙。機械人的中心總是在...

機械人搬重物 BFS

時間限制 1 sec 記憶體限制 256 mb 機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑 1.6 公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個 n m 的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間...

P1126 機械人搬重物

機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑1.6公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個n m的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受的指令有 向前移動1...