马的遍历

题目链接https://www.luogu.com.cn/problem/P1443#submit

思路:其实就是用bfs,自己记录下bfs怎么用

首先确定他的运动规律马走日所以在一个点可以有八种不同走法,安座标来就是{1,2},{2,1}。。。。所以建立dx,dy两个数组来表示怎么走。

我们用队列,因为有x,y两个坐标不好一起放在一个队列,分开放,大概思路就是,把当前位置的x,y坐标分别放进一个数组,然后循环一遍当前点可走(所以进行了判断,超过范围或已经走过了的就跳过不管)的路线,,让a[xx][yy]=1表示已经走过,b[xx][yy]=b[q.front()][q1.front()]+1;表示这个点所需要的步数,然后把可行路线到达的点的x,y坐标分别放入队列,这样循环后就是把这个点可走的点都标记完了,当前点也没用了,把他踢出队列。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,m,x,y;
int a[405][405],b[405][405]; 
int dx[8]={1,2,-1,-2,-1,-2,1,2};
int dy[8]={2,1,2,1,-2,-1,-2,-1};
queue<int>q,q1;
void bfs()
{
	while(!q.empty()) 
	{
		for(int i=0;i<8;i++)
		{
		      int xx=q.front()+dx[i];
		      int yy=q1.front()+dy[i];
		      if(xx>0&&xx<=n&&yy>0&&yy<=m&&!a[xx][yy])
		      {
		      	a[xx][yy]=1;
		      	b[xx][yy]=b[q.front()][q1.front()]+1;
		      	q.push(xx);
		      	q1.push(yy);
			  }
		}
		q.pop();
		q1.pop();
	}
}
int main()
{
	memset(b,-1,sizeof b);
	cin>>n>>m>>x>>y;
    q.push(x);
    q1.push(y);
	a[x][y]=1;
	b[x][y]=0;
	bfs();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
		  cout<<"     "<<b[i][j];	
		}cout<<endl;
	}
	
	return 0;
}
全部评论

相关推荐

02-11 17:47
已编辑
门头沟学院 Java
神哥不得了:神哥来啦~建议先在网上找一些高频的八股去背,然后再去广泛的背八股,这样的学习会更有效率一些,简历的这两个项目建议换掉,换成两个高质量的项目,这样的话获得面试的比例会更高一点,专业技能的话排版要注意一下,要加句号的话就都加,要不加就都不加,荣誉奖项的话写在教育经历里边吧,这个确实没有太多的含金量
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务