洛谷題解 P1126 機械人搬重物

2021-10-03 17:32:21 字數 2856 閱讀 9741

洛谷,

機械人移動學會(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。

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

12
乙個機械人從某個座標出發,要求達到某乙個終點。差不多是乙個標準的走迷宮問題,增加了一些限制條件和移動的方法不一樣。

1、有方向之分。也就是說機械人只能向當前方向移動。

2、機械人指令:creep、walk、run、left、right。

3、機械人是有大小的。題目告訴我們機械人直徑有 1.6m,也就是說要考慮這個因素。參考插圖,可以看出,當地圖某個位置是障礙物,即資料為 1,這個障礙物四周機械人是沒法走的。因為每個格仔只有 1m 大小,機械人直徑有 1.6m。還有乙個就是迷宮的邊緣機械人沒法走。

注意機械人開始有乙個方向,如本題樣例方向是 s。所謂的開始方向的含義就是,creep、walk 和 run 這三個指令只能向當前方向運動。其他沒什麼好寫的。省略吧。

套用標準 bfs 遍歷的模板即可。

1、我是使用了 c++ 的 enum 型別,定義方法如下:

enum dir ;
使用 enum 只是增加了**的可讀性,其他無卵用。

2、在座標定義中需要增加方向定義。定義方法如下:

struct pos ;
我反正沒想出什麼方法可以歸一化描述。只好用最笨的方法,逐一描述機械人所以指令。偽**如下:

處理走路的3中方法

處理左轉

處理右轉

#include #include enum dir ;

struct pos ;

const int maxn = 54;

struct maze ;

int bfs(maze &maze);

int main() ;

scanf("%d %d", &maze.row, &maze.col);

int i, j;

for (i=1; i<=maze.row; i++)

} }char dir;

scanf("%d %d %d %d %c", &maze.x1, &maze.y1, &maze.x2, &maze.y2, &dir);

if (dir=='s') else if (dir=='w') else if (dir == 'n') else

//特別處理

if (maze.x2<1||maze.x2>=maze.row||maze.y2<1||maze.y2>=maze.col||maze.map[maze.x2][maze.y2]==1)

printf("%d\n", bfs(maze));

return 0;

}int bfs(maze &maze) ;

const int dy[4] = ;

//const int dx[4] = ;

//const int dy[4] = ;

int i;

while (q.empty()!=true)

//開始走路

for (i=1; i<=3; i++) else if (maze.visit[next.x][next.y][cur.dir]==false)

} //左轉

next.x = cur.x;

next.y = cur.y;

next.dir = cur.dir - 1;

if (next.dir==-1)

if (maze.visit[next.x][next.y][next.dir]==false)

//右轉

next.dir = cur.dir + 1;

if (next.dir==4)

if (maze.visit[next.x][next.y][next.dir]==false) }

return -1;

}

洛谷P1126 機械人搬重物

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

洛谷P1126 機械人搬重物

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

P1126機械人搬重物 洛谷

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