馬的遍歷(BFS 洛谷

2021-10-25 04:40:02 字數 1841 閱讀 4410

題目描述

有乙個n*m的棋盤(1輸入格式

一行四個資料,棋盤的大小和馬的座標

輸出格式

乙個n*m的矩陣,代表馬到達某個點最少要走幾步(左對齊,寬5格,不能到達則輸出-1)

樣例輸入

3 3 1 1
**輸出 **

0    3    2    

3 -1 1

2 1 4

看到題目第一想法是~

1:馬是怎麼走的?哈哈哈哈哈。。。

「馬」走動的方法是每步一直一斜,即先橫著或直著走一格,然後再斜著走乙個對角線,俗稱「馬走日」。在「日」的對角線上兩點可以一步到達,其他地方不能到達,如圖所示。

(x-2,y-1)

(x-2,y+1)

(x-1,y-2)

(x-1,y+2)

(x,y)馬

(x+1,y-2)

(x+1,y+2)

(x+2,y-1)

(x+2,y+1)

3:然後想到了廣度優先搜尋,讓我們先來解釋一下這種搜尋方式。

例如:這棵樹

bfs搜尋,假設從1開始,然後遍歷和1相鄰的2,3,4,接著通過2,3,4遍歷5 6 7 8 9 10(注意順序)

實現過程是通過乙個佇列:(這裡通過陣列表示的佇列)12

3456

78910

1234

5678

91012

3456

78910

當頭指標等於尾指標時,遍歷完畢,或者說符合條件的點,已經遍歷完畢。12

3456

78910

1234

5678

91012

3456

78910

我們可以發現每一次的遍歷都離原始點1是相同的距離,所以當我們做某些最短路徑的題時候,可以考慮一下bfs。

先來乙個模板:

bfs模板(廣度優先搜尋)

void

bfs()}

}}

具體操作:

1:選擇乙個二維陣列res ,先全部賦值為-1,裡面存放到最終結果(棋盤上每一點的最短步數)

2: 用乙個結構體陣列a來表示馬所在的位置,並充當bfs模板的佇列,head,tail,充當佇列的頭尾指標

3:兩個陣列x,y聯合表示馬可以到達的八個位置,用於判斷是否符合條件,然後就是要注意在判斷的時候不要越界就好啦。

然後是不是感覺來了,那就自己先試一試吧,萬一就ac了呢。

完整**:

#include

int n,m,nx,ny;

int res[

405]

[405];

//res表示最終輸出結果,下標代表棋盤位置,值代表最少步數

int x[8]

=;int y[8]

=;struct queuea[

40010];

//構建bfs的佇列(用陣列表示)

void

bfs(

int i,

int j)}}

}int

main()

printf

("\n");

}}

洛谷1443 馬的遍歷 BFS

馬的遍歷p1443 思路 從開始的點map sx sy 開始廣搜,需要注意的是要記錄三個狀態,當前位置的橫縱座標加上到當前位置的步數,可以借助結構體來實現。廣搜後如果沒有被訪問到的,就是永遠也訪問不了的,記為 1.include include include include using names...

洛谷1443 馬的遍歷 bfs

題意 給乙個n m的棋盤,馬在上面走 規則就是象棋中的規則,詳細見 dx,dy陣列定義 問棋盤上每個點馬都需要走幾步到達。思路 簡單bfs。注意輸出應該用 5d 不加空格 1 include2 include3 include4 include 5 include6 include7 include...

洛谷 P1443 馬的遍歷(bfs)

題意 乙個n m的棋盤,給你馬的起始座標,輸出到達棋盤上每一點的最少步數,無法到達則輸出 1。思路 bfs即可。具體解釋見 include include include include include using namespace std int n,m,x,y 棋盤和馬的初始座標 int qu...