欢迎光临散文网 会员登陆 & 注册

P1443 马的遍历

2023-02-27 16:16 作者:仓鼠翞  | 我要投稿

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");
   }
}
//

P1443 马的遍历的评论 (共 条)

分享到微博请遵守国家法律