Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157249
  • 博文数量: 35
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 21:36
文章存档

2010年(10)

2009年(25)

我的朋友

分类:

2010-12-20 19:55:56

Distance on Chessboard
Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 17034Accepted: 5985

Description

国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示: 

王、后、车、象的走子规则如下: 
  • 王:横、直、斜都可以走,但每步限走一格。 
  • 后:横、直、斜都可以走,每步格数不受限制。 
  • 车:横、竖均可以走,不能斜走,格数不限。 
  • 象:只能斜走,格数不限。


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

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

Source



#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
    int t;
    char coordinate[2][3];
    int king = 0,
     queen = 0,
     castle = 0,
     bishop = 0,
        differ_x = 0,
        differ_y = 0;
    
    scanf("%d", &t);
    while(t--){
        scanf("%s %s", coordinate[0], coordinate[1]);
        differ_x = abs(coordinate[1][0] - coordinate[0][0]);
        differ_y = abs(coordinate[1][1] - coordinate[0][1]);
        if(differ_x == 0 && differ_y == 0){//两点重合

            king = 0;
            queen = 0;
            castle = 0;
            bishop = 0;
            printf("%d %d %d %d\n", king, queen, castle, bishop);
        }
        else if(differ_x == 0){//两点同列

            king = differ_y;
            queen = 1;
            castle = 1;
            
            if(differ_y % 2 == 1){
                printf("%d %d %d Inf\n", king, queen, castle);
            }
            else{
                bishop = 2;
                printf("%d %d %d %d\n", king, queen, castle, bishop);
            }
        }
        else if(differ_y == 0){//两点同行

            king = differ_x;
            queen =1;
            castle = 1;
            
            if(differ_y % 2 == 1){
                printf("%d %d %d Inf\n", king, queen, castle);
            }
            else{
                bishop = 2;
                printf("%d %d %d %d\n", king, queen, castle, bishop);
            }
        }
        else if(differ_x == differ_y){//两点同斜行

            king = differ_x;
            queen = 1;
            castle = 2;
            bishop = 1;
            printf("%d %d %d %d\n", king, queen, castle, bishop);
        }
        else{//不同行、不同列、不同斜行

            king = abs(differ_x - differ_y) + (differ_x<differ_y?differ_x:differ_y);
            queen = 2;
            castle = 2;
            if(differ_x % 2 != differ_y % 2){
                printf("%d %d %d Inf\n", king, queen, castle);
            }
            else{
                bishop = 2;
                printf("%d %d %d %d\n", king, queen, castle, bishop);
            }
        }
    }

    return 0;
}

注:王、后、车比较好判断,象只可到达棋盘中相同颜色的格子;注意起始点和终点重合的情况。
阅读(521) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~