題目描述
有乙個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...