1.链接地址:
http://bailian.openjudge.cn/practice/1657
http://poj.org/problem?id=1657
2.题目:
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:
王、后、车、象的走子规则如下:
- 王:横、直、斜都可以走,但每步限走一格。
- 后:横、直、斜都可以走,每步格数不受限制。
- 车:横、竖均可以走,不能斜走,格数不限。
- 象:只能斜走,格数不限。
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。- 输入
- 第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。
- 输出
- 对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".
- 样例输入
2 a1 c3 f5 f8- 样例输出
2 1 2 1 3 1 1 Inf- 来源
- POJ Monthly--2004.05.15 Liu Rujia@POJ
3.思路:
4.代码:
1 #include <iostream> 2 #include <cmath> 3 4 using namespace std; 5 6 int main() 7 { 8 int t; 9 std::cin>>t; 10 for(int i = 0; i < t; i++) 11 { 12 std::cin.get(); 13 char x1,y1,x2,y2; 14 std::cin>>x1>>y1; 15 std::cin.get(); 16 std::cin>>x2>>y2; 17 18 int dis1 = abs(x1 - x2); 19 int dis2 = abs(y1 - y2); 20 21 int step1 = dis1>dis2?dis1:dis2; 22 23 int step2; 24 if(dis1 == 0 && dis2 == 0){step2 = 0;} 25 else if (dis1 == 0 || dis2 == 0) {step2 = 1;} 26 else if(dis1 == dis2) {step2 = 1;} 27 else {step2 = 2;} 28 29 int step3; 30 if(dis1 == 0 && dis2 == 0) {step3 = 0;} 31 else if(dis1 == 0 || dis2 == 0){step3 = 1;} 32 else step3 = 2; 33 34 std::cout<<step1<<" "<<step2<<" "<<step3<<" "; 35 36 int step4; 37 if(dis1 == 0 && dis2 == 0) 38 { 39 std::cout<<"0"; 40 } 41 else if(dis1 == dis2) 42 { 43 std::cout<<"1"; 44 } 45 else if((dis1+dis2)%2 == 0) 46 { 47 std::cout<<"2"; 48 } 49 else 50 { 51 std::cout<<"Inf"; 52 } 53 54 std::cout<<std::endl; 55 56 } 57 return 0; 58 }
OpenJudge/Poj 1657 Distance on Chessboard
原文:http://www.cnblogs.com/mobileliker/p/3563809.html