洛谷——P1443 马的遍历

https://www.luogu.org/problem/show?pid=1443#sub

题目描述

有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

输入输出格式

输入格式:

一行四个数据,棋盘的大小和马的坐标

输出格式:

一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

输入输出样例

输入样例#1:
3 3 1 1
输出样例#1:
0    3    2    
3    -1   1    
2    1    4    

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 
 6 using namespace std;
 7 
 8 const int N(405);
 9 int n,m,x,y;
10 
11 struct Node
12 {
13     int x,y;
14 }node;
15 int cnt[N][N],vis[N][N];
16 int fx[8]={1,1,2,2,-1,-1,-2,-2};
17 int fy[8]={2,-2,1,-1,2,-2,1,-1};
18 queue<Node>que;
19 void BFS(Node s)
20 {
21     que.push(s); cnt[s.x][s.y]=0;
22     for(;!que.empty();)
23     {
24         Node a,fro=que.front();que.pop();
25         for(int i=0;i<8;i++)
26         {
27             int xx=fro.x+fx[i],yy=fro.y+fy[i];
28             if(cnt[xx][yy]!=-1||xx<1||yy<1||xx>n||yy>m) continue;
29             cnt[xx][yy]=cnt[fro.x][fro.y]+1;
30             a.x=xx,a.y=yy; que.push(a);
31         }
32     }
33 }
34 
35 int main()
36 {
37     scanf("%d%d%d%d",&n,&m,&node.x,&node.y);
38     memset(cnt,-1,sizeof(cnt));
39     BFS(node);
40     for(int i=1;i<=n;i++)
41     {
42         for(int j=1;j<=m;j++)
43             printf("%-5d",cnt[i][j]);
44         printf("
");
45     }
46     return 0;
47 }
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7140503.html