Hdoj 1374.Knight Moves 题解
Problem Description
A 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
The 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.
Output
For each test case, print one line saying "To get from xx to yy takes n knight moves.".
Sample Input
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
Sample Output
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.
Source
University of Ulm Local Contest 1996
思路
简单的bfs问题,每次马可以往八个方向跳,只要不出边界,就加到队列后面,直到扩展完所有状态或者到达目标位置就好了
代码
#include<bits/stdc++.h>
using namespace std;
int x1,y1,x2,y2;
int x[8]={1,1,2,2,-1,-1,-2,-2};
int y[8]={2,-2,1,-1,2,-2,1,-1};//马可以跳的八个方向
struct node
{
int x;
int y;
int step;
}st,ed;
bool vis[10][10];//访问标志
bool judge(node x)
{
if(x.x<=8&&x.x>=1&&x.y<=8&&x.y>=1)
return true;
return false;
}//是否在边界里面的判断
int getNumber(char c)
{
if(c=='a') return 1;
if(c=='b') return 2;
if(c=='c') return 3;
if(c=='d') return 4;
if(c=='e') return 5;
if(c=='f') return 6;
if(c=='g') return 7;
if(c=='h') return 8;
if(c=='1') return 1;
if(c=='2') return 2;
if(c=='3') return 3;
if(c=='4') return 4;
if(c=='5') return 5;
if(c=='6') return 6;
if(c=='7') return 7;
if(c=='8') return 8;
}//处理字符串,获得坐标
int bfs(node st)
{
queue<node> q;
memset(vis,false,sizeof(vis));
q.push(st);
vis[st.x][st.y] = true;
if(st.x==ed.x && st.y==ed.y) return 0;
node now,next;
while(!q.empty())
{
now = q.front();
q.pop();
for(int i=0;i<8;i++)//往八个方向扩展
{
next.x = now.x + x[i];
next.y = now.y + y[i];
next.step = now.step + 1;
if(next.x==ed.x && next.y==ed.y)
return next.step;
if(judge(next)&&vis[next.x][next.y]==false)
{
q.push(next);
vis[next.x][next.y]=true;
}
}
}
}
int main()
{
string tmp1,tmp2;
while(cin>>tmp1>>tmp2)
{
st.x = getNumber(tmp1[1]); st.y = getNumber(tmp1[0]); st.step=0;
ed.x = getNumber(tmp2[1]); ed.y = getNumber(tmp2[0]);
int ans = bfs(st);
cout << "To get from " << tmp1 << " to " << tmp2;
cout << " takes " << ans << " knight moves." << endl;
}
return 0;
}
Hdoj 1374.Knight Moves 题解的更多相关文章
- HDU 1372 Knight Moves 题解
Knight Moves Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU1372:Knight Moves(经典BFS题)
HDU1372:Knight Moves(BFS) Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %l ...
- HDU 1372 Knight Moves(BFS)
题目链接 Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) whe ...
- 1450:【例 3】Knight Moves
1450:[例 3]Knight Moves 题解 这道题可以用双向宽度搜索优化(总介绍在 BFS ) 给定了起始状态和结束状态,求最少步数,显然是用BFS,为了节省时间,选择双向BFS. 双向B ...
- HDOJ/HDU 1372 Knight Moves(经典BFS)
Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where yo ...
- 题解 UVA439 骑士的移动 Knight Moves
前言 最近板子题刷多了-- 题意 一个 \(8\times 8\) 的棋盘,问马从起点到终点的最短步数为多少. \(\sf Solution\) 要求最短路径嘛,显然 bfs 更优. 读入 这个读入处 ...
- POJ2243 Knight Moves —— A*算法
题目链接:http://poj.org/problem?id=2243 Knight Moves Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 【习题 6-4 UVA-439】Knight Moves
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] bfs模板题 [代码] /* 1.Shoud it use long long ? 2.Have you ever test sev ...
- Knight Moves
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
随机推荐
- json和ajax学习
1.java对象和json字符串的转换 2.json对象list集合和json字符串转换 3.map对象和json转换
- PS调出唯美冷色情侣婚纱写真照
一.打开PS原片,原片是一张JPG格式的片子 色温较高整个画面较红离对着上面的我们标准的韩式色调我们来进行调节吧 ,我就不打太多文字解释一些基本常规了 二.韩式婚纱内景喜欢加点烟雾.其实我本人是不太喜 ...
- 【学习总结】Git学习-参考廖雪峰老师教程一-Git简介
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- Oss文件存储
包含文件的上传下载和生成临时的url # -*- coding: utf-8 -*- import os import oss2 import configparser from Config imp ...
- Eclipse Todo Tasks 任务试图
java - Find TODO tags in Eclipse - Stack Overflowhttps://stackoverflow.com/questions/16903046/find-t ...
- mongoDB 安装和配置环境变量,超详细版本
下载mongoDB进行安装:https://www.mongodb.com/ 到Community Se ...
- MySQL查询优化注意下面的四个细节
原文:http://bbs.landingbj.com/t-0-244231-1.html 在任何一个数据库中,查询优化都是不可避免的一个话题.对于数据库工程师来说,优化工作是最有挑战性的工作.MyS ...
- MySQL根据某个字段查询重复的数据
select count(*) '个数',mobile '手机号',`name` '用户名' from users group by mobile having(count(*) > 1); = ...
- Postman的Post请求方式的四种类型的数据
1. form-data 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件时 ...
- MySQL 字段内容区分大小写
数据由Oracle 迁入MySQL ,由于之前Oracle区分大小写,MySQL的配置使用了默认配置,导致一些数据导入失败,有的唯一键报错,冲突. 将测试过程记录在下面. 数据库版本:MySQL 5. ...