题目描述

在一个标准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)的更多相关文章

  1. hihoCoder 1308:搜索二·骑士问题(BFS预处理)

    题目链接 题意 中文题意. 思路 对于每一个骑士,可以先预处理出到达地图上某个点的需要走的步数,然后最后暴力枚举地图上每一个点,让三个骑士走过的距离之和最小即可. #include <bits/ ...

  2. 骑士游历/knight tour - visual basic 解决

    在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题. 在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完 ...

  3. 【BZOJ1085】[SCOI2005]骑士精神 双向BFS

    [BZOJ1085][SCOI2005]骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它 ...

  4. 杂项:Unity3D

    ylbtech-杂项:Unity3D Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具 ...

  5. 【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&amp;攻略+SSG改动+打开存档补丁]

    冒险者们哟.寻找龙秘玉吧--! ninetail的最新作,是使用丰富多彩的技能·道具探索迷宫的3D迷宫RPG! 存在着骑士和神官的架空世界常见的职业为首的13种职业.超过数百种的道具的登场! 和伙伴一 ...

  6. SFC游戏列表(维基百科)

    SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...

  7. Noip2019暑期训练2

      题目名称 骑士遍历 和谐俱乐部 农场派对 对称二叉树 存盘文件名 knight Beautiful party tree 输入文件名 knight.in Beautiful.in party.in ...

  8. BFS 骑士的移动

    骑士的移动 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E 题目: Description A f ...

  9. HDU 1372 Knight Moves【BFS】

    题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...

随机推荐

  1. POJ 2187 求凸包上最长距离

    简单的旋转卡壳题目 以每一条边作为基础,找到那个最远的对踵点,计算所有对踵点的点对距离 这里求的是距离的平方,所有过程都是int即可 #include <iostream> #includ ...

  2. FB分别编译各个项目

    FB里面有个 ActionScript模块 功能, 可以将 不同模块分别编译成一个个swf,这样会将各个独立的模块从主swf中分离出来.如果玩家没使用过这个模块,就不会加到内存中去,这样可以减少不必要 ...

  3. mybatis写mapper文件注意事项(转)

    原文链接:http://wksandy.iteye.com/blog/1443133 xml中某些特殊符号作为内容信息时需要做转义,否则会对文件的合法性和使用造成影响 < < > & ...

  4. Line计划今年全面进军中国市场:建立本地团队

    北京时间6月13日下午消息,<华尔街日报>报道称,移动消息应用Line计划于今年晚些时候进军中国市场.Line将在中国建立本地团队,开发内容和功能,从而进一步开拓中国这一全球最大的移动市场 ...

  5. PHP ceil() 函数

    定义和用法 ceil() 函数向上舍入为最接近的整数. 语法 ceil(x) 参数 描述 x 必需.一个数. 说明 返回不小于 x 的下一个整数,x 如果有小数部分则进一位.ceil() 返回的类型仍 ...

  6. JS tab切换事件

    $('ul.main-tab>li').on('mousedown', data, function() { var $this = $(this), $box = $('.main-tab-c ...

  7. 2016-1-7第一个完整APP 私人通讯录的实现 5:保存数据

    一:登陆界面 1):用户点击登陆按钮并成功登陆后,根据此时的开关情况选择是否保存数据,代码如下: "]) { [self performSegueWithIdentifier:@" ...

  8. FineUI疑难杂症

    1. 导出excel操作:因为fineui里的按钮自带异步功能,所以要把 EnableAjax="false" DisableControlBeforePostBack=" ...

  9. FastReport产品介绍及免费下载地址

    公司地址: 俄罗斯 公司网址: http://www.fast-report.com 详细信息: 由技术总监Alexander Tzyganenko创建于1998年,Fast Reports, Inc ...

  10. vim的Tab设置为4个空格

    vim /etc/vimrc 1    set ts=42    set expandtab3    set autoindent 按tab键时产生的是4个空格,这种方式具有最好的兼容性.