骑士问题

  • 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;
}

你可能感兴趣的:(骑士问题)