使用BFS求最小步數

2021-08-21 16:08:51 字數 2428 閱讀 9170

bfs寬度優先搜尋經常用於求最短路徑長度,許多的最短路徑演算法都是基於該思想。

洪尼瑪今天準備去尋寶,在乙個n*n (n行, n列)的迷宮中,存在著乙個入口、一些牆壁以及乙個寶藏。由於迷宮是四連通的,即在迷宮中的乙個位置,只能走到與它直接相鄰的其他四個位置(上、下、左、右)。現洪尼瑪在迷宮的入口處,問他最少需要走幾步才能拿到寶藏?若永遠無法拿到寶藏,則輸出-1。

多組測試資料。

每組資料輸入第一行為正整數n,表示迷宮大小。

接下來n行,每行包括n個字元,其中字元'.'表示該位置為空地,字元'#'表示該位置為牆壁,字元's'表示該位置為入口,字元'e'表示該位置為寶藏,輸入資料中只有這四種字元,並且's'和'e'僅出現一次。

n≤1000

輸出拿到寶藏最少需要走的步數,若永遠無法拿到寶藏,則輸出-1。

5 s.#.. #.#.# #.#.# #...e #....

#include#include#include#include#includeusing namespace std; 

char map[1001][1001];

int vis[1001][1001];

int n, dx[4] = , dy[4] = ;

int x11, y11, x22, y22, flag;

struct point

tmp1,tmp2;

int main()

if (map[i][j] == 'e')

}} tmp1.x = x11, tmp1.y = y11; //頭點入隊並標記

q.push(tmp1); vis[tmp1.x][tmp1.y] = 1;

while (!q.empty())

for (int i = 0; i < 4; i++) //四個方向走

}} if (flag)

cout << vis[x22][y22] -1 << endl;

else

cout << "-1" << endl;

} return 0;

}

time limit:1000ms

memory limit:65536k

total submissions:32406

accepted:18515

description

定義乙個二維陣列: 

int maze[5][5] = ;
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。

input

乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一解。

output

左上角到右下角的最短路徑,格式如樣例所示。

sample input

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

sample output

(0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(2, 4)

(3, 4)

(4, 4)

一道普通的bfs問題,但所求不是最短步數而是最短路徑,那麼需要乙個二維記錄陣列來記錄這個位置的點的上乙個位置。

#include#include#include#include#includeusing namespace std; 

int map[10][10], vis[10][10], dx[4] = , dy[4] = ;

struct point

tmp1,tmp2;

point pre[10][10], ans[100];

int main()

}} int lastx = 4, lasty = 4, num = 0; //從終點開始不斷向前找位置

while (lastx!=0 || lasty!=0)

cout << "(0, 0)" << endl;

for (int i = num - 1; i >= 0; i--)

printf("(%d, %d)\n", ans[i].x, ans[i].y);

} return 0;

}

BFS 最小步數 續

上一次用的dfs,這次bfs,直接在地圖上擴充套件結點,如下圖所示 橙黃色代表起點,淺藍色終點。include include using namespace std define access 0 struct position start,end const int direction 4 2 ...

NYOJ 最小步數(bfs)

nyoj 58最小步數 時間限制 3000 ms 記憶體限制 65535 kb 難度 4描述 這有乙個迷宮,有0 8行和0 8列 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0...

nyoj 58 最小步數(bfs)

初入手搜尋,慢慢來,學演算法不能著急 本題從某一點開始廣搜.就是把上下左右可能的點都遍歷,看看有沒有合適的點,如果有,就放入佇列,然後4個方向判斷完成後,再從隊首取出乙個元素,接著進行,注意 當隊列為空時,說明搜尋結束仍然沒有找到目標點。這裡的廣搜和樹的層序遍歷極為相似,大家可以先看下樹的層序建立,...