Knight Moves
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7661 Accepted Submission(s): 4567
friend of you is doing research on the Traveling Knight Problem (TKP)
where you are to find the shortest closed tour of knight moves that
visits each square of a given set of n squares on a chessboard exactly
once. He thinks that the most difficult part of the problem is
determining the smallest number of knight moves between two given
squares and that, once you have accomplished this, finding the tour
would be easy.
Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.
Your
job is to write a program that takes two squares a and b as input and
then determines the number of knight moves on a shortest route from a to
b.
input file will contain one or more test cases. Each test case consists
of one line containing two squares separated by one space. A square is a
string consisting of a letter (a-h) representing the column and a digit
(1-8) representing the row on the chessboard.
#include<cstdio>
#include<cstring>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
char s[3],s2[3];
int vis[10][10];
struct node{
int x,y;
int step_cnt;
};
node now,nex;
node vs,vd;
int check(node v)
{
if(v.x>=1&&v.x<=8&&v.y>=1&&v.y<=8&&!vis[v.x][v.y])
return 1;
else return 0;
}
void bfs()
{
queue<node>que;
vs.step_cnt=0;
que.push(vs);
vis[vs.x][vs.y]=1;
while(!que.empty()){
now=que.front();
que.pop();
if(now.x==vd.x&&now.y==vd.y) return;
nex.x=now.x+2;nex.y=now.y+1;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} nex.x=now.x+2;nex.y=now.y-1;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} nex.x=now.x-2;nex.y=now.y+1;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} nex.x=now.x-2;nex.y=now.y-1;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} nex.x=now.x+1;nex.y=now.y+2;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} nex.x=now.x+1;nex.y=now.y-2;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} nex.x=now.x-1;nex.y=now.y+2;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} nex.x=now.x-1;nex.y=now.y-2;nex.step_cnt=now.step_cnt+1;
if(check(nex)) {que.push(nex);vis[nex.x][nex.y]=1;} }
}
int main()
{
while(~scanf("%s%s",s,s2))
{
memset(vis,0,sizeof(vis));
vs.x=s[1]-'0';
vs.y=s[0]-96;
vd.x=s2[1]-'0';
vd.y=s2[0]-96;
bfs();
printf("To get from %s to %s takes %d knight moves.\n",s,s2,now.step_cnt);
}
}
给一个棋盘,算出马从一个点走到另一个点的最小步数(马走日)
Knight Moves的更多相关文章
- HDU 1372 Knight Moves
最近在学习广搜 这道题同样是一道简单广搜题=0= 题意:(百度复制粘贴0.0) 题意:给出骑士的骑士位置和目标位置,计算骑士要走多少步 思路:首先要做这道题必须要理解国际象棋中骑士的走法,国际象棋中 ...
- [宽度优先搜索] HDU 1372 Knight Moves
Knight Moves Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- HDU 1372 Knight Moves (bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...
- UVA 439 Knight Moves --DFS or BFS
简单搜索,我这里用的是dfs,由于棋盘只有8x8这么大,于是想到dfs应该可以过,后来由于边界的问题,TLE了,改了边界才AC. 这道题的收获就是知道了有些时候dfs没有特定的边界的时候要自己设置一个 ...
- 【POJ 2243】Knight Moves
题 Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are ...
- hdu Knight Moves
这道题实到bfs的题目,很简单,不过搜索的方向变成8个而已,对于不会下象棋的会有点晕. #include <iostream> #include <stdio.h> #incl ...
- HDU 1372 (搜索方向稍有改变) Knight Moves
其实手写模拟一个队列也挺简单的,尤其是熟练以后. 尼玛,这题欺负我不懂国际象棋,后来百度了下,国际象棋里骑士的走法就是中国象棋里面的马 所以搜索就有八个方向 对了注意初始化标记数组的时候,不要把起点标 ...
- HDU 1372 Knight Moves【BFS】
题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...
- UVA 439 Knight Moves
// 题意:输入标准国际象棋棋盘上的两个格子,求马最少需要多少步从起点跳到终点 BFS求最短路: bfs并维护距离状态cnt, vis记录是否访问过 #include<cstdio> ...
随机推荐
- 未将对象引用设置到对象的实例 启用 JIT 调试后,任何无法处理的异常
严谨!!!! DataSet ds = salarySum.GetDataSalarySum2(libUser.SelectedValue, dtpMonth.Value.Date); ...
- ASIHTTPRequest详解 [经典3]
大文件断点续传 0.94 以后支持大文件的断点下载,只需要设置: [ request setAllowResumeForFileDownloads:YES ]; [ request setDownlo ...
- Android笔记:实现点击事件
布局文件声明控件 .java文件获取控件 1. button.setOnClickListener(new View.OnClickListener() { @Override ...
- Mysql undo与redo Log
http://mysql.taobao.org/monthly/2015/04/01/ http://www.cnblogs.com/Bozh/archive/2013/03/18/2966494.h ...
- iOS - HTTPS接口加密和身份认证
为什么要使用HTTPS代替HTTP HTTPS和HTTP的区别 https协议需要到CA申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https则是具有安全性的SS ...
- 关于logcat日志
最近学习android,碰到了logcat,个人总结一下. 当不出日志是解决办法: ProjectMenu---后台设置----LOG设置---LOG开关 Logcat(deprecated)和Log ...
- UVA 10405最长公共子序列
裸最长公共子序列,直接贴代码 #include<cstdio> #include<iostream> #include<algorithm> #include< ...
- 三、jQuery--jQuery基础--jQuery基础课程--第4章 jQuery表单选择器
1.:input表单选择器 如何获取表单全部元素?:input表单选择器可以实现,它的功能是返回全部的表单元素,不仅包括所有<input>标记的表单元素,而且还包括<textarea ...
- Python 的三目运算
其他语言:php 判定条件?为真时的结果:为假时的结果 $a=88 $b=99 $res = $a>$b?$a>$b 搞笑的Python:令人意想不到的语法形式 true_value if ...
- 使用RMAN DUPLICATE...FROM ACTIVE DATABASE创建物理standby database
Applies to: Oracle Server - Enterprise Edition - Version 11.1.0.6 to 11.2.0.4 [Release 11.1 to 11.2] ...