您的位置:首页 > 其它

骑士问题

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.

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: