巡邏機械人 UVa 1600

2022-06-09 01:33:11 字數 2024 閱讀 8098

機械人要從乙個m*n(1≤m,n≤20)網格的左上角(1,1)走到右下角(m,n)。網格中的一些格仔是空地(用0表示),其他格仔是障礙(用1表示)。機械人每次可以往4個方向走一格,但不能連續地穿越k(0≤k≤20)個障礙,求最短路長度。起點和終點保證是空地。例如,對於圖6-22(a)中的資料,圖6-22(b)中顯示的是最優解,路徑長度為10。

第一行為pn,代表該組輸入要處理幾個問題。

下面有n組問題,每組的第一行是兩個數,\(m,n(1<=m,n<=20)\)。

下面的一行為k,代表最大越過障礙數,\(0<=k<=20\)。

下面的m行n列為輸入的網格。

對於每組問題,輸出一行,內容為起點到終點的最短路徑。若起點到終點無法通達,輸出-1。

sample input

46 7

20 0 0 0 0 0 0

0 1 0 1 0 1 0

0 0 1 1 0 0 0

1 1 1 0 0 1 0

0 1 1 1 1 1 1

0 0 0 0 0 0 0

2 50

0 1 0 0 0

0 0 0 1 0

4 61

0 1 1 0 0 0

0 0 1 0 1 1

0 1 1 1 1 0

0 1 1 1 0 0

2 20

0 11 0

sample output710

-1

bfs應該都能想到,但是這個bfs有點不同,剛開始我搞了好久都是wa,也不知道錯哪了。

我最開始的想法是和普通的bfs一樣,但是對於網格中的每個位置記錄乙個pace,代表走了多少步,然後如果這個位置是障礙物,並且已經超過k了,那麼就不能走了。不過這個想法有些問題,欠考慮,一會再說。

queueq

q.push(起點)

while(q.not_empty())

for(adj : n.adjs)

if(adj.pace > k) continue;

q.push(adj)

vis[adj] = 1}}

}

考慮這個示例

1

2 92

0 1 1 1 0 1 1 0 0

0 1 1 0 0 1 1 1 0

如果你的演算法是按左下右上的方式遍歷的,並且是vis未和k關聯,那麼將返回-1,但是我們肉眼都能看到有一條通路。

因為按左上右下的方式遍歷第2,2個位置(下標從1開始)已經被1,2標記為訪問過了,所以從2,1位置無法訪問。

這個題目比較抽象,我馬上要上課了,也懶得畫圖,腦袋裡想想好了。

所以到這裡基本思路就理清了,不能按傳統的bfs的vis標記來做,應該把vis和k關聯。

#include "iostream"

#include "cstdio"

#include "queue"

#include "cstring"

#define max 21

#define maxk 21

using namespace std;

struct node

node(){}

};int pn,m,n,k;

int g[max][max];

int vis[max][max][21];

int dx = ;

int dy = ;

bool inside(node node)

int bfs() }}

}return -1;

}void build()

}}int main()

return 0;

}

E 巡邏機械人

題意大概 機械人要從乙個m n m和n的範圍都在1到20的閉區間內 的網格的左上角 1,1 走到右下角 m,n 網格中的一些格仔是空地,用0表示,其它格仔是障礙,用1表示。機械人每次可以往四個方向走一格,但不能連續地穿越k 0,20 個障礙,求最短路長度。起點和終點保證是空地。思路 用bfs搜尋即可...

A電機不轉 公尺兔機械人 600元DIY巡邏機械人

forcode 絕大部分人都覺得,399元的公尺兔機械人只是乙個兒童玩具,那種簡單的積木式程式設計,沒什麼實用價值。這是沒有創造力和想象力的人的想法,剛產生了乙個點子 我可以讓這個不到400元的積木機械人,變成乙個強大的巡邏機械人。公尺兔機械人的主機提供4個typec電源介面,我考慮把其中乙個介面接...

安保巡邏機械人如何在公共場所提供安全應用?

隨著國內對安防市場的重視,我國的安防市場結構也變得越來越複雜,經過多年的發展,不論在生產製造行業,還是在民生服務當中,都已經形成了一條安防產業鏈。安防巡邏機械人是乙個整合環境感知 動態決策 行為控制和報警裝置,具備自主感知 自主行走 自主保護 互動交流等能力,可幫助人類完成基礎性 重複性 危險性的安...