Description
Input
Output
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; }