献上代码
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N=402;
int chess[N][N],n,m;
struct dire{
int x,y;
}dire[N*N];//创建结构体存储坐标
//下过象棋应该知道马走日字形
//所以先列出怎么走的八个方向
//八个方向进行遍历,下面是遍历时+x和+y的值
int direX[8]={2,1,-1,-2,2,1,-1,-2},direY[8]={1,2,2,1,-1,-2,-2,-1};
/*方向如下图
-2,-1 -2,1
-1,-2 -1,2
0,0
1,-2 1,2
2,-1 2,1
*/
/*
本题思路,根据象棋马的走法,建立走的位置数组
然后把棋盘先全部初始化无法到(-1),开始点0
然后在开始点使用广度优先遍历,遍历能达到的点,并且赋值
同时注意边界处理,防止出现数组[-x][-y]或者大于数组[n][m]的情况
*/
int x,y;//初始点
//我们走完一个点就可以进入下一层,不需要回到上一层,
//那么,我们可以使用先进先出的队列来实现BFS算法
void bfs()
{
int hh=0,tt=0;//队头和队尾
dire[0]={x,y};//队列第一个就是开始点
while(hh<=tt)
{
struct dire dd=dire[hh++];
for(int i=0;i<8;i++)
{
int xx=dd.x+direX[i];
int yy=dd.y+direY[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&chess[xx][yy]==-1)
{
chess[xx][yy]=chess[dd.x][dd.y]+1;
dire[++tt]={xx,yy};
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>x>>y;
memset(chess,-1,sizeof chess);//初始化全为-1,所有点都没法到达
chess[x][y]=0;//开始点为0
bfs();//宽度优先搜索算法
//输出棋盘遍历结果
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%-5d", chess[i][j]);
cout<<endl;
}
return 0;
}
输出结果和格式应该没问题,但就是提交0分,求大佬解答疑惑