骑士问题(knight) (BFS)
题目描述
在一个标准8×8的国际象棋棋盘上,棋盘中有些格子可能是有障碍物的。已知骑士的初始位置和目标位置,你的任务是计算出骑士最少需要多少步可以从初始位置到达目标位置。有障碍物的格子当然不可以到达。
标准的8×8的国际象棋棋盘中每一个格子可以用唯一的编号确定。行用1~8这8个数字依次表示,列用a~h这8个字母依次表示。例如图中的骑士所在位置(图中有n的格子)的编号为“d4”(注意d和4之间没有空格)。
我们知道国际象棋中的骑士可以按“L”路线移动(一个方向走2个格子,接着垂直方向走1个格子)。因此,图中的骑士(位于d4),可以到达位置c2、b3、b5、c6、e6、f5、f3和e2(图中有“x”标记的格子)。此外,骑士不能移出棋盘。
骑士可以按照移动规则自由地在棋盘上没有障碍物的格子中移动,图中给出了一个骑士移动的例子。初始格子用“n”标记,目标格子用“N”标记,有障碍物的格
子用“b”标记。一个可行的移动序列在图中用数字标记出来(al,b3,a5,c6,e5,94,h2,fl),总共需要7步才能完成。事实上,这也就是
最小的步数了。
输入
输入文件包括1个或多个测试数据。
每1个测试数据的第1行是一个整数b(-1≤b≤62),表示棋盘中有障碍物的格子数目,当b=-1时,输入文件结束;
第2行含b个不同的有障碍物的格子编号,用空格隔开。当b=0 时,此行为空行;
第3行是骑士的初始格子和目标格子的编号,也是用空格隔开。初始格子和目标格子是不同的,且都没有障碍物。
输出
对于每个数据,输出1行。格式:Board n:m moves,其中n表示数据的序号(从1开始),m表示骑士所用的最小的步数。如果骑士无法到达目标格子,输出:Board n:not reachable。
样例输入
8
c5 b4 c1 b2 e1 e5 f4 f2
d3 h8
8
e8 e7 e6 e5 e4 e3 e2 e1
d3 h8
-1
样例输出
Board 1: not reachable
Board 2: 3 moves
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
using namespace std;
int n,m,flag,a,b;
int dis[][]= {-,,-,,,,,,,-,,-,-,-,-,-};
int vis[][];
int w[][];
string str;
struct man
{
int x,y,step;
};
queue<man>q;
void bfs(man s,int enx,int eny)
{
q.push(s);
vis[s.x][s.y]=;
while(!q.empty())
{
man t=q.front();
q.pop();
//printf("%d %d %d\n",t.x,t.y,t.step);system("pause");
if(t.x==enx&&t.y==eny)
{
printf("%d moves\n",t.step);
flag=;
return;
}
for(int i=; i<; i++)
{
int xx=t.x+dis[i][];
int yy=t.y+dis[i][];//
//printf("%d %d\n",xx,yy);
if(xx>=&&xx<&&yy>=&&yy<&&w[xx][yy]!=&&vis[xx][yy]==)
{
man k;
k.x=xx;
k.y=yy;
k.step=t.step+;
q.push(k);
vis[xx][yy]=;
}
}
}
}
int main()
{
int g,h;int cnt=;
while(~scanf("%d",&n))
{cnt++;flag=;
while(!q.empty())q.pop();
int enx;int eny; if(n==-)break;
memset(vis,,sizeof(vis));
memset(w,,sizeof(w));
while(n--)
{
cin>>str;
w[str[]-'a'][str[]-'']=;
}
string sta,en;
cin>>sta>>en;
man s;s.x=sta[]-'a';s.y=sta[]-'';s.step=;q.push(s);
enx=en[]-'a';eny=en[]-'';
printf("Board %d: ",cnt);
bfs(s,enx,eny);
if(flag==)puts("not reachable");
} return ;
}
帅得不要不要的
骑士问题(knight) (BFS)的更多相关文章
- hihoCoder 1308:搜索二·骑士问题(BFS预处理)
题目链接 题意 中文题意. 思路 对于每一个骑士,可以先预处理出到达地图上某个点的需要走的步数,然后最后暴力枚举地图上每一个点,让三个骑士走过的距离之和最小即可. #include <bits/ ...
- 骑士游历/knight tour - visual basic 解决
在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题. 在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完 ...
- 【BZOJ1085】[SCOI2005]骑士精神 双向BFS
[BZOJ1085][SCOI2005]骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它 ...
- 杂项:Unity3D
ylbtech-杂项:Unity3D Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具 ...
- 【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&攻略+SSG改动+打开存档补丁]
冒险者们哟.寻找龙秘玉吧--! ninetail的最新作,是使用丰富多彩的技能·道具探索迷宫的3D迷宫RPG! 存在着骑士和神官的架空世界常见的职业为首的13种职业.超过数百种的道具的登场! 和伙伴一 ...
- SFC游戏列表(维基百科)
SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...
- Noip2019暑期训练2
题目名称 骑士遍历 和谐俱乐部 农场派对 对称二叉树 存盘文件名 knight Beautiful party tree 输入文件名 knight.in Beautiful.in party.in ...
- BFS 骑士的移动
骑士的移动 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E 题目: Description A f ...
- HDU 1372 Knight Moves【BFS】
题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...
随机推荐
- plist 和 Xib
plist文件 mainbudin加载时候有后缀 xib文件 mainbudin加载时候无需后缀
- 提升web响应速度的思路
web响应(主要指加载网页类,不包括大文件下载,看视频)的核心瓶颈在于延迟,不在于带宽. 从感性认知的角度,由于存在tcp的慢启动,所以往往速率还未达到带宽值时,访问就已经结束:另外,没有交互就没有延 ...
- hadoop源码阅读
1.Hadoop的包的功能分析 2.由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化.Hadoop并没有采用java的序列化,而是引入它自己的系统.org.ap ...
- android中正确导入第三方jar包
android中正确导入第三方jar包 andriod中如果引入jar包的方式不对就会出现一些奇怪的错误. 工作的时候恰好有一个jar包需要调用,结果用了很长时间才解决出现的bug. 刚开始是这样引用 ...
- 防止忘记初始化NSMutableArray的方法
在写项目的过程中,经常会遇到一些郁闷的事,往一个可变数组中添加一个模型数据时,经常会发现程序运行很正常,可是可变数组中就是没有任何数据,久病成医,我发现自己总是放一个错,就是NSMutableArra ...
- c# access插入null值
c# 插入access数据库 提示错误: Parameter @DeviceLocation has no default value. 参数@DeviceLocation 的有没有默认值. Stri ...
- 用C#感受MongoDB MapReduce之魅力 转
MapReduce这个名词随着hadoop的用户的增多,越来越被人关注.MapReduce可谓MongoDB之中的亮点,我也想深入了解MapReduce,加上MongoDB操作简单,所以就选择了它.M ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- C++中的::operator new, ::operator delete
一般在使用new 和 delete的时候,做了两件事情,一是空间的配置( new 是分配,delete是回收),而是调用对象的析构函数 但是也有办法将这两个过程分开 那就是显式的调用::operat ...
- Divisors_组合数因子个数
Description Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- ...