博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P1443马的遍历(BFS)
阅读量:6568 次
发布时间:2019-06-24

本文共 1748 字,大约阅读时间需要 5 分钟。

题目描述

有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

输入输出格式

输入格式:

 

一行四个数据,棋盘的大小和马的坐标

 

输出格式:

 

一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

题解

//其中有好多重复标记的地方,请见谅#include
using namespace std;queue
qx;//横坐标队列queue
qy;//纵坐标队列//我才不会告诉你是我懒得写结构体了呢int dx[9]={
0,+2,+2,+1,+1,-1,-1,-2,-2};int dy[9]={
0,+1,-1,+2,-2,+2,-2,+1,-1};//搜索时更改坐标int bx,by;//变换后的坐标int sx,sy;//起始坐标int nx,ny;//现在的坐标int n,m;//棋盘大小int ans[401][401];//答案数组bool bo[401][401];//判断是否走过 false表示不能走,反之能走void bfs(int x,int y);//BFSint main(){ cin>>n>>m; memset(bo,false,sizeof(bo));//都不能走 可以一会在判断越界的时候少写几行... for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ans[i][j]=-1; //答案数组置为-1,若没有被更新则还是-1,可以直接输出 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) bo[i][j]=true;//输入的范围内能走 cin>>sx>>sy; bfs(sx,sy); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(j==m) {printf("%-5d\n",ans[i][j]);} else {printf("%-5d",ans[i][j]);}//输出 return 0;}void bfs(int x,int y){ ans[x][y]=0;//起点步数为0 qx.push(x);//加入队列 qy.push(y); while(!qx.empty()){ //队列非空 nx=qx.front(); //取出节点对其拓展 qx.pop(); //删除节点 ny=qy.front(); qy.pop(); bo[nx][ny]=false; //标记为不能走 for(int i=1;i<=8;i++){ bx=nx+dx[i]; //将要判断的节点 by=ny+dy[i]; if(bo[bx][by]==true){
//判断可走 qx.push(bx); qy.push(by); bo[bx][by]=false;//不同起步可能指向相同节点 必须操作后马上就标记避免重复入队 不要担心重复标记 标了没事 不标大概率会T (我之前T了三次,还是看dalao题解才发现的...) ans[bx][by]=ans[nx][ny]+1; } } }}

转载于:https://www.cnblogs.com/Alarak26/p/8528816.html

你可能感兴趣的文章
mysql数据库从删库到跑路之mysql完整性约束
查看>>
简单的Writer和Reader
查看>>
zabbix学习(四)IT_Service管理
查看>>
linux 下的lamp的简单安装
查看>>
Typescript 其实就想排个序和枚举取数
查看>>
virt-manager管理kvm
查看>>
python测试rabbitmq的消息收发
查看>>
熊猫直播Rancho发布系统构建之路
查看>>
DbUtils
查看>>
mac 环境下 制作windows系统U盘启动盘
查看>>
JMeter基础之一个简单的性能测试
查看>>
让批处理运行不显示窗口的两个方法
查看>>
江苏省环保厅数据中心同城灾备建设项目
查看>>
hadoop 安全模式
查看>>
我的友情链接
查看>>
新手教程:用.htaccess实现二级域名功能
查看>>
How to attack a windows domain
查看>>
安装完Arch后,要安装的软件
查看>>
洛谷——P2035 iCow
查看>>
空类,虚函数类,虚继承类的空间大小
查看>>