P1443 马的遍历

Posted fuxiqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1443 马的遍历相关的知识,希望对你有一定的参考价值。

题目描述

有一个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    

来源

洛谷:https://www.luogu.org/problemnew/show/P1443

分析

1.这道题是典型的搜索,个人认为BFS更好用,加上STL队列(queue 相关介绍点这里);

2.用一个布尔数组标记地图,每个点只能入队一次,且第一次入队的绝对是最短的;

3.用memset初始数组(棋盘);

上代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>    //memset用到
 4 #include<queue>    //STL队列用到
 5 using namespace std;
 6 int nextt[8][2]= {{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};      //方向
 7 int s[500][500];       //定义棋盘
 8 bool mark[500][500];            //标记棋子
 9 struct node                  //用一个结构体存储当前所在的位置
10 {
11   int x,y,step;
12 };
13 int n,m,sx,sy;
14 int i,j;
15 void bfs(int a,int b)
16 {
17   int k;
18   mark[a][b]=1;               
19   s[a][b]=0;                    //起点设为0
20   queue<node>q;              //定义队列
21   node q1;
22   q1.x=a;
23   q1.y=b;
24   q1.step=0;
25   q.push(q1);                     //起点坐标入队
26   while(!q.empty())      //搜索
27   {
28     node q2=q.front();
29     for(k=0; k<=7; k++)          
30     {
31       int xx=q2.x+nextt[k][0];
32       int yy=q2.y+nextt[k][1];
33       if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&(!mark[xx][yy]))//判断是否出界
34       {
35         node q3;
36         q3.x=xx;
37         q3.y=yy;
38         q3.step=(q2.step+1);
39         q.push(q3);
40         mark[xx][yy]=1;
41         s[xx][yy]=q3.step;
42       }
43     }
44     q.pop();               //重要一步
45   }
46 }
47 int main()
48 {
49   memset(s,-1,sizeof(s));            //棋盘初始化
50   scanf("%d%d%d%d",&n,&m,&sx,&sy);
51   bfs(sx,sy);
52   for(i=1; i<=n; i++)          //输出
53   {
54     for(j=1; j<=m; j++)
55     {
56       printf("%-5d",s[i][j]);           //注意输出格式
57     }
58     printf("
");
59   }
60   return 0;
61 }

 

以上是关于P1443 马的遍历的主要内容,如果未能解决你的问题,请参考以下文章

P1443 马的遍历

P1443 马的遍历

P1443 马的遍历

P1443 马的遍历

洛谷——P1443 马的遍历

洛谷 P1443 马的遍历