大头壳

大头大头 下雨不愁 人家有伞 我有大头
posts - 1, comments - 6, trackbacks - 0, articles - 22
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Distance on Chessboard

Posted on 2008-03-28 10:07 王大头 阅读(469) 评论(1)  编辑 收藏 引用

Distance on Chessboard
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
POJ Monthly--2004.05.15 Liu Rujia@POJ

 

#include <stdio.h>

 
#define MAX(x,y)        ((x>y)?x:y)
#
define ABS(z)          ((z<0)?(-z):(z))

int
main(void)
{
        int     n
,nn,k,q,r,b,i,j;
        char    c1[
3]="00\n",c2[3]="00\n";

        scanf(
"%d",&nn);
        
for(n=0;n<nn;n++) {
                k
=0;q=0;r=0;r=0;
                scanf(
"%2s %2s",c1,c2);
                i
=ABS((c1[0]-c2[0]));
                j
=ABS((c1[1]-c2[1]));

                
if(i==0&&j==0) {
                        
printf("0 0 0 0\n");
                        
continue;
                }
                
else                    k=MAX(i,j);

                
if(i==0||j==0||i==j)    q=1;
                
else                    q=2;

                
if(i==0||j==0)          r=1;
                
else                    r=2;

                
if(i==j)                b=1;
                
else if((i+j)%2)        b=-1;
                
else                    b=2;

                
if(b<0)
                        
printf("%d %d %d Inf\n",k,q,r);
                
else
                        
printf("%d %d %d %d\n",k,q,r,b);
        }
        
return 0;
}

Feedback

# re: Distance on Chessboard  回复  更多评论   

2008-12-17 21:22 by ridgehk
很强大-。-
忍不住留言了
差点用广搜写了

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理