機械人要從乙個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電源介面,我考慮把其中乙個介面接...
安保巡邏機械人如何在公共場所提供安全應用?
隨著國內對安防市場的重視,我國的安防市場結構也變得越來越複雜,經過多年的發展,不論在生產製造行業,還是在民生服務當中,都已經形成了一條安防產業鏈。安防巡邏機械人是乙個整合環境感知 動態決策 行為控制和報警裝置,具備自主感知 自主行走 自主保護 互動交流等能力,可幫助人類完成基礎性 重複性 危險性的安...