洛谷,
有乙個 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...