1. 程式人生 > >洛谷1443 馬的遍歷【bfs】

洛谷1443 馬的遍歷【bfs】

ret 定義 namespace iostream tro 詳細 string ble names

題目鏈接:https://www.luogu.org/problemnew/show/P1443

題意:

給一個n*m的棋盤,馬在上面走(規則就是象棋中的規則,詳細見代碼dx,dy數組定義)

問棋盤上每個點馬都需要走幾步到達。

思路:

簡單bfs。註意輸出應該用%-5d(不加空格)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<map>
 4 #include<set>
 5 #include<iostream>
 6 #include<cstring>
 7 #include<algorithm>
 8
#include<vector> 9 #include<queue> 10 11 using namespace std; 12 13 int n, m; 14 struct node{ 15 int x, y; 16 int step; 17 }st; 18 int mat[405][405]; 19 20 int dx[8] = {1, 1, 2, -2, 2, -2, -1, -1}; 21 int dy[8] = {2, -2, 1, 1, -1, -1, 2, -2}; 22 23 bool check(int i, int j) 24 {
25 return (i > 0 && i <= n && j > 0 && j <= m); 26 } 27 28 int main() 29 { 30 scanf("%d%d", &n, &m); 31 scanf("%d%d", &st.x, &st.y); 32 memset(mat, -1, sizeof(mat)); 33 st.step = 0; 34 queue<node>que; 35 que.push(st);
36 mat[st.x][st.y] = 0; 37 while(!que.empty()){ 38 node now = que.front();que.pop(); 39 node tmp; 40 tmp.step = now.step + 1; 41 for(int i = 0; i < 8; i++){ 42 tmp.x = now.x + dx[i]; 43 tmp.y = now.y + dy[i]; 44 if(check(tmp.x, tmp.y) && mat[tmp.x][tmp.y] == -1){ 45 mat[tmp.x][tmp.y] = tmp.step; 46 que.push(tmp); 47 } 48 } 49 } 50 for(int i = 1; i <= n; i++){ 51 for(int j = 1; j <= m; j++){ 52 printf("%-5d", mat[i][j]); 53 } 54 printf("\n"); 55 } 56 57 return 0; 58 }

洛谷1443 馬的遍歷【bfs】