骑士问题
2015-07-17 15:02
211 查看
Description
国际象棋是一种二人对弈的战略棋盘游戏。国际象棋的棋盘由8×8共64个黑白相间的格子组成,从白棋的角度来看,从左往右为A列至H列,从下往上为第1行至第8行。黑白棋子各16枚,分为王(King)、后(Queen)、车(Rook)、象(Bishop)、马(Knight)、兵(Pawn)六种。其中马(Knight)这种棋子(在西方被成为骑士)的走法与中国象棋中的“马”类似,骑士每一步先横走或直走两格,再向侧面走一格,骑士途经的格子都必须在棋盘以内。
现在给出一枚“骑士”所在的格子以及它要前往的格子的坐标(由一个大写字母和一个数字表示),请你计算出它最少需要走几步。
Input
多组测试数据,每组数据占一行,给出起点和终点的坐标。
Output
每组数据输出一行“From * to * needs at least # steps.”,其中两个‘*’分别代表起点和终点的坐标,‘#’为最少需要的步数,若不超过一步,step后不需要加上s。
Sample Input
A1 C2
A1 E3
Sample Output
From A1 to C2 needs at least 1 step.
From A1 to E3 needs at least 2 steps.
国际象棋是一种二人对弈的战略棋盘游戏。国际象棋的棋盘由8×8共64个黑白相间的格子组成,从白棋的角度来看,从左往右为A列至H列,从下往上为第1行至第8行。黑白棋子各16枚,分为王(King)、后(Queen)、车(Rook)、象(Bishop)、马(Knight)、兵(Pawn)六种。其中马(Knight)这种棋子(在西方被成为骑士)的走法与中国象棋中的“马”类似,骑士每一步先横走或直走两格,再向侧面走一格,骑士途经的格子都必须在棋盘以内。
现在给出一枚“骑士”所在的格子以及它要前往的格子的坐标(由一个大写字母和一个数字表示),请你计算出它最少需要走几步。
Input
多组测试数据,每组数据占一行,给出起点和终点的坐标。
Output
每组数据输出一行“From * to * needs at least # steps.”,其中两个‘*’分别代表起点和终点的坐标,‘#’为最少需要的步数,若不超过一步,step后不需要加上s。
Sample Input
A1 C2
A1 E3
Sample Output
From A1 to C2 needs at least 1 step.
From A1 to E3 needs at least 2 steps.
#include<iostream> using namespace std; #define Maxn 64 #define Inf 1000 int step[9][2]={0,0,1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1}; int ans[Maxn][Maxn]; int legal(int a,int b) { if(a>=0 && a<8 && b>=0 && b<8) return 1; return 0; } void init() { int x,y,i,j,k; for(i=0;i<Maxn;i++) { for(j=0;j<Maxn;j++) ans[i][j]=Inf; ans[i][i]=0; } for(i=0;i<8;i++) { for(j=0;j<8;j++) for(k=1;k<=8;k++) { x=i+step[k][0]; y=j+step[k][1]; if(legal(x,y)) ans[i*8+j][x*8+y]=1; } } } void floyd() { int k,i,j; for(k=0;k<Maxn;k++) { for(i=0;i<Maxn;i++) for(j=0;j<Maxn;j++) { if(ans[i][k]+ans[k][j]<ans[i][j]) ans[i][j]=ans[i][k]+ans[k][j]; } } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); char s1[3],s2[3]; int N1,N2,xb,yb; init(); floyd(); while(scanf("%s %s",s1,s2)!=EOF) { xb=s1[0]-'A';yb=s1[1]-'1';N1=xb*8+yb; xb=s2[0]-'A';yb=s2[1]-'1';N2=xb*8+yb; printf("From %s to %s needs at least %d step",s1,s2,ans[N1][N2]); if(ans[N1][N2]>1) printf("s"); printf(".\n"); getchar(); } return 0; }
相关文章推荐
- ThinkPad X240 Ubuntu 14.10 LTS 系统找不到wifi网络的解决方案 / 手动安装无线网卡驱动
- 关于StretchDIBits 可能返回失败的原因!
- 图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
- 教程-隐藏/显示任务栏-程序不在任务显示-全面控制Windows
- 如何把任意文件隐藏在一张图片里?
- I NEED A OFFER!
- android资源收藏
- 浅析c++中virtual关键字
- Windows 10 Build 10240专业版全新安装和激活教程
- eclipse快捷键及各种设置
- SQL 中的 1NF 2NF 3NF三大范式
- HTTP长连接与短连接
- 教程-MessageBox 使用方法
- 阿里巴巴开源项目
- 怎么面试架构师
- 各种IO方式
- 图书馆
- 工作过程中遇到的问题记录
- 教程-Delphi资源文件(全面分析于使用)
- Android反射打造万能SharedPreferences