Poj 1657 Distance on Chessboard

Description

国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示: 
Poj 1657 Distance on Chessboard_第1张图片
王、后、车、象的走子规则如下: 
  • 王:横、直、斜都可以走,但每步限走一格。 
  • 后:横、直、斜都可以走,每步格数不受限制。 
  • 车:横、竖均可以走,不能斜走,格数不限。 
  • 象:只能斜走,格数不限。


写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。 

Input

第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。 

Output

对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".

Sample Input

2
a1 c3
f5 f8

Sample Output

2 1 2 1
3 1 1 Inf

这题目挺有意思所以写了下来。第一眼看见它就想马上广搜........定眼一看不对劲,王 后 车 象 的走法很是霸气。然后就找规律了。

我考虑了四种情况的摆放:同一水平,同一竖线,同一斜线,和其他。 四种情况的最少步数其实基本差不多..........关键是象只能斜着走,于是我用0,1,模拟棋盘的黑白色,来判断象能否到达目标点........没去优化,代码重复较多。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
int map[10][10];
int hori(int x1,int y1,int x2,int y2)//是否水平
{
    if(y1 == y2)
        return true;
    return false;
}
int vert(int x1,int y1,int x2,int y2)//是否竖线
{
    if(x1 == x2)
        return true;
    return false;
}
int spl(int x1,int y1,int x2,int y2)//是否斜线,斜率为+ -1
{
    if(abs(x1-y1) == abs(x2-y2) || abs(x1+y1) == abs(x2+y2))
        return true;
    return false;
}
bool color(int x1,int y1,int x2,int y2 )//判断象能否到达
{
    if(map[x1][y1] == map[x2][y2])
        return true;
    return false;
}
int main()
{
    int n,i,j,x1,x2,y1,y2;
    char a[3],b[3];
    scanf("%d",&n);
    for(i=0; i<8; i++)//制造黑白棋盘
    {
        if(i%2 == 0)
            map[i][0] = 1;
        else
            map[i][0] = 0;
        for(j=1; j<8; j++)
        {
            map[i][j]=1 - map[i][j-1];
        }
    }
    while(n--)
    {
        cin >> a >> b;
        x1=a[0] - 'a';
        y1=a[1] - '1';
        x2=b[0] - 'a';
        y2=b[1] - '1';
        if(strcmp(a,b) == 0)//起点终点为一点
        {
            printf("0 0 0 0\n");
            continue;
        }
        if(hori(x1,y1,x2,y2) )//水平
        {
            printf("%d 1 1 ",abs(x1-x2));
            if(color(x1,y1,x2,y2) )
                printf("2\n");
            else
                printf("Inf\n");

        }
        else if(vert(x1,y1,x2,y2) )//竖直
        {
            printf("%d 1 1 ",abs(y1-y2));
            if(color(x1,y1,x2,y2) )
                printf("2\n");
            else
                printf("Inf\n");

        }
        else if(spl(x1,y1,x2,y2) )//斜线
        {
            printf("%d 1 2 ",abs(y1-y2));
            if(color(x1,y1,x2,y2) )
                printf("1\n");
            else
                printf("Inf\n");
        }
        else//其他
        {
            printf("%d 2 2 ",abs(y1-y2)+abs(x1-x2));
             if(color(x1,y1,x2,y2) )
                printf("2\n");
            else
                printf("Inf\n");
        }
    }
    return 0;
}


你可能感兴趣的:(Poj 1657 Distance on Chessboard)