HDU1372 Knight Moves(BFS)
2016-07-24 14:50
441 查看
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 mostdifficult 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) representingthe 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.
————————————————————————————————————————————
象棋的马的走法,走日子,计方向时注意点,其他和普通的没两样#include<iostream> #include<cstring> #include<queue> #include<cstdio> using namespace std; int map[10][10]; int dir[8][2]={{-2,-1},{-1,-2},{-1,2},{-2,1},{2,1},{1,2},{2,-1},{1,-2}}; struct node { int x,y,cnt; }; bool cheak(int i,int j) { if(i<1||i>8||j<1||j>8) return 0; else return 1; } int bfs(int si,int sj,int di,int dj) { queue<node>q; node f,d; f.x=si; f.y=sj; f.cnt=0; q.push(f); while(!q.empty()) { f=q.front(); q.pop(); if(f.x==di&&f.y==dj) return f.cnt; for(int i=0;i<8;i++) { d.x=f.x+dir[i][0]; d.y=f.y+dir[i][1]; if(cheak(d.x,d.y)) { d.cnt=f.cnt+1; q.push(d); } } } return -1; } int main() { char a,b; int xa,xb,ya,yb; while(~scanf("%c%d %c%d",&a,&ya,&b,&yb)) { getchar(); xa=a-'a'+1; xb=b-'a'+1; int ans=bfs(xa,ya,xb,yb); printf("To get from %c%d to %c%d takes %d knight moves.\n",a,ya,b,yb,ans); } return 0; }
相关文章推荐
- tar命令详解
- git基础
- 实习记录(四)
- Android中okhttp的基本用法1的基础上进行封装
- css3总结
- Custom Components(自定义组件)
- iOS 双击tableView回顶部
- ffmpeg结构体以及函数介绍(二)
- Java 源码-模态对话框(Modal Dialog Box)的实现
- Spark小课堂Week5 Scala初探
- 架构实例之Demo_JSP_JavaBean
- Linux常用命令
- 虚拟存储器--虚拟地址与物理地址
- ffmpeg结构体以及函数介绍(一)
- 面向对象之 封装 继承 多态
- socket编程---fgets和fputs函数使用理解
- Mysql的数据类型
- logging 模块记录日志
- Git 常用命令
- Android源码探究之AsyncTask 源码解析