POJ 1657 Distance on Chessboard
题目链接——> 点击打开链接
Distance on Chessboard
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 27886 | Accepted: 9402 |
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
Problem Idea
对于象,可以将棋盘上的格点分为两类:第一类是它的横坐标与纵坐标只差为奇数;第二类是差为偶数。
因为象每走一步,其横纵坐标增加或减少的绝对值是相等的,所以其横纵坐标的绝对值只差的奇偶性是不变的。所以如果出发时的横纵坐标差 值是奇或偶,则终点一定是与其出发的点的奇偶性相同的,不相同就输出INF。而后如果 x==y,则一步就可以到达,如果不等,就2步到达。
因为象每走一步,其横纵坐标增加或减少的绝对值是相等的,所以其横纵坐标的绝对值只差的奇偶性是不变的。所以如果出发时的横纵坐标差 值是奇或偶,则终点一定是与其出发的点的奇偶性相同的,不相同就输出INF。而后如果 x==y,则一步就可以到达,如果不等,就2步到达。
【注意】
#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(int argc, char** argv) {
int t;
cin>>t;
while(t--){
char begin[5];//起始位置
char end[5];// 终止位置
//scanf("%s%s",begin,end);
cin>>begin>>end;
int x,y;//长、宽
x=abs(begin[0]-end[0]);
y=abs(begin[1]-end[1]);
if(x==0&&y==0) printf("0 0 0 0\n");
else{
int d1,d2,d3,d4;
//计算王的步数,横竖斜1步
if(x<y){
cout<<y<<" ";
}
else{
cout<<x<<" ";
}
//d1=min(x,y)+abs(x-y);
//计算后的步数,横竖斜不限步
if(x==y||x==0||y==0){
cout<<"1"<<" ";
}
else{
cout<<"2"<<" ";
}
//计算车的步数,横竖不限步,不能斜;
if(x==0||y==0){
cout<<"1"<<" ";
}
else{
cout<<"2"<<" ";
}
//计算象的步数,只能斜不限步;
if(abs(x-y)%2!=0){
cout<<"Inf"<<endl;
}
else if(x==y){
cout<<"1"<<endl;
}
else{
cout<<"2"<<endl;
}
}
}
return 0;
}
Source Code