洛谷題解 P1443 馬的遍歷

2021-10-03 17:19:57 字數 2517 閱讀 5096

洛谷,

有乙個 n*m 的棋盤 (1 < n, m <= 400),在某個點上有乙個馬,要求你計算出馬到達棋盤上任意乙個點最少要走幾步?

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

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

3 3 1 1
0    3    2    

3 -1 1

2 1 4

告訴我們乙個棋盤大小為 n*m,再告訴我們乙個起點座標 x,y。要求我們算出到棋盤所有點最少要走幾步。

從最少這個字可以看出,本題可以考慮使用 bfs 來實現。

根據樣例輸入,我們知道棋盤大小為 3*3,開始位置為 1,1。注意,本題開始的不是零。下面我們來繪製一下到各個點需要的最少步數。我們知道不管西洋棋還是中國象棋,馬都是走「日」字。如下圖所示:

//座標定義

typedef struct _pos pos;

//馬所有移動方式定義

const pos moves = , ,,,,,,};

就是自己,自然不需要移動已經到了,也就是說輸出 0。

從 1,1 出發要到 2,1 ,移動的方法如下圖所示:1,1 -> 3,2 -> 1,3 -> 2,1,這樣一共走了 3 次。

從 1,1 出發要到 3,1 ,移動的方法如下圖所示:1,1 -> 2,3 -> 3,1,這樣一共走了 2 次。

從 1,1 出發要到 1,2 ,移動的方法如下圖所示:1,1 -> 2,3 -> 3,1 -> 1,2,這樣一共走了 3 次。

從 1,1 出發要到 2,2 ,不管怎麼走都沒法走到,這樣輸出 -1。

從 1,1 出發要到 3,2 ,移動的方法如下圖所示:1,1 -> 3,2,這樣一共走了 1 次。

從 1,1 出發要到 1,3 ,移動的方法如下圖所示:1,1 -> 3,2 -> 1,3,這樣一共走了 2 次。

從 1,1 出發要到 2,3 ,移動的方法如下圖所示:1,1 -> 2,3,這樣一共走了 1 次。

從 1,1 出發要到 3,3 ,移動的方法如下圖所示:1,1 -> 3,2 -> 1,3 -> 2,1 -> 3,3,這樣一共走了 4 次。

從上面分析可知,最終的輸出結果為:

0    3    2    

3 -1 1

2 1 4

因此,只需要使用 bfs 遍歷 n*m 棋盤的所有點,記錄每個點到起點的距離即可。

從上面的資料分析中,我們可以得出,本題是乙個 bfs 的模板題。

1、讀入資料。

2、從指定起點開始使用 bfs 遍歷矩陣,記錄所有位置到起點的距離。

3、輸出距離。

#include #include #include const int maxn = 4e2+2;

struct maze ;

struct pos ;

void bfs(maze &maze) ,,,,,,,};//移動方法

int i;

while (q.empty() != true)

} }}int main() ;

scanf("%d %d %d %d", &maze.row, &maze.col, &maze.x1, &maze.y1);

memset((void*)maze.dis, -1, sizeof(maze.dis));//將起點到所有點距離設定為-1

bfs(maze);

int i, j;

for (i=1; i<=maze.row; i++)

printf("\n");

} //fclose(stdout);

return 0;

}

1、由於題目輸出有格式要求,即左對齊,寬 5 格。因此使用 printf 比較簡單。**如下:

printf("%-5d", ******);
其中 - 表示左對齊,5 表示佔位格數。

2、關於無法到達點距離問題。這個問題有兩個解決方法。

方案一:開始的時候,將所有點到起點的距離設定為 -1。通過 bfs 遍歷一次棋盤後,所有不能到達的位置距離自然不會變化。**如下:

memset((void*)maze.dis, -1, sizeof(maze.dis));
方案二:輸出的時候配合 vis 矩陣,所有距離為 0 的點,如果 vis[i][j] 對應的值為 false,說明無法訪問到,輸出 -1 即可。**如下:

for (i=1; i<=maze.row; i++)  else 

} else

}printf("\n");

}

題解 洛谷P1443 馬的遍歷

1.注意輸出格式 printf 5d 代表左對齊,空5格。2.team陣列要開的大點。否則會wa或者re一些點。3.結構體來存team陣列,最後要判斷到不了輸出 1 好像也沒啥了。include include include include include includeusing namespa...

洛谷 P1443 馬的遍歷

題目概述 有乙個n m的棋盤 1 解題思路 使用廣搜,注意地圖邊界和馬跳的方向即可。可以採用for代替8個if來減少要碼的字。注意棧的讀寫。時間複雜度 o n m 空間複雜度 o n m 源程式 const d array 1.2,1.8 of longint 2,2,1,1,1,1,2,2 1,1...

洛谷 P1443馬的遍歷

有乙個n m的棋盤 1輸入格式 一行四個資料,棋盤的大小和馬的座標 輸出格式 乙個n m的矩陣,代表馬到達某個點最少要走幾步 左對齊,寬5格,不能到達則輸出 1 輸入樣例 1 複製3 3 1 1 輸出樣例 1 複製0 3 2 3 1 1 2 1 4 include include include i...