P1443 马的遍历
https://www.luogu.com.cn/problem/P1443
#include<cstdio>
#include<queue>
using namespace std;
struct locate
{
int x;//横坐标
int y;//纵坐标
};
int direction[8][2]={
{-1,-2},
{+1,-2},
{-2,-1},
{+2,-1},
{-2,+1},
{+2,+1},
{-1,+2},
{+1,+2}
};
int main()
{
int n, m, a, b;//n代表矩阵行数m代表矩阵列数x和y是起始坐标
scanf("%d %d %d %d", &n, &m, &a, &b);
locate first;//第一个起点
first.x = a;
first.y = b;
int result[401][401] ;//用于存储最小值结果没有访问过则用-1代表,那么此时就不可以用访问过的全部点数去判断循环是否会终止
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
result[i][j]=-1;
}
//定义BFS队列
queue<locate> Q;
Q.push(first);
bool visited[401][401];//用于确定此点是否被访问过
//初始化所有点未被访问
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
visited[i][j]=false;
}
visited[first.x][first.y]=true;//起始坐标标记为访问过
result[first.x][first.y]=0;//起始点到自身的距离为0
//需定义距离dist,每次出队并把相邻节点加入时则距离加一
while (Q.empty()==false)//在队列为空是循环停止说明已经访问玩图中的全部元素
{
//队头元素出队用head保存队头元素
locate head=Q.front();
Q.pop();//出队
//每次的result结果应该是出队元素的result的基础上增加一
//还没有遍历结束则遍历所有的邻居
//要判断此时的邻居有没有超过矩阵的边界
for(int i=0;i<8;i++)
{
//定义临时变量用于保存此时周围的八个点的临时信息
locate temp;
temp.x=head.x+direction[i][0];
temp.y=head.y+direction[i][1];
if(head.x+direction[i][0]>=1&&head.x+direction[i][0]<=n&&
head.y+direction[i][1]>=1&&head.y+direction[i][1]<=m&&
visited[head.x+direction[i][0]][head.y+direction[i][1]]==false)//没有超过行的范围也没有超过列的范围并且此点也没有访问过
{
Q.push(temp);
visited[temp.x][temp.y]=true;//标记为访问过
//给每个邻接点赋予此时的距离值
result[temp.x][temp.y]=result[head.x][head.y]+1;//从出队元素的距离基础上加一
}
}
}
//遍历结束则打印result矩阵
for(int i=1;i<=n;i++)
{
for (int j = 1; j <= m; j++)
printf("%d ", result[i][j]);
printf("\n");
}
}
//