国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:
王、后、车、象的走子规则如下:
王:横、直、斜都可以走,但每步限走一格。
后:横、直、斜都可以走,每步格数不受限制。
车:横、竖均可以走,不能斜走,格数不限。
象:只能斜走,格数不限。
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
思路:
初步构思可以将其中一个点位于点(0,0),另一点 横纵坐标的绝对值 即 两点横纵坐标之差的绝对值
,用坐标差(均非负)解题:
王:取横纵坐标差中最大值,即所求
后:1步或2步,若两点 竖直 水平 斜 共线为1步,其余两步
车:1步或2步,若两点 竖直 水平 共线为1步,其余两步
象:1步或2步或Inf,可以发现 '象只能抵达相同颜色块',异色块'Inf'同色块斜共线1步其余2步
颜色异同转化为'坐标差奇偶性' 斜共线转换为'坐标差相等' 竖直水平共线转化为'坐标差为0'"
当然,两点重合输出 "0 0 0 0\n"
核心代码:
注:int型以char型读入后 - ‘a’ 非理想值,必须用char
while(T--) { getchar();/*这个不能忘*/
char c1, c2;//int - 'a' 不可
int x1, y1, x2, y2, ans;
scanf("%c%d %c%d", &c1, &y1, &c2, &y2);
x1 = c1 - 'a' + 1; x2 = c2 - 'a' + 1;
int m1 = abs(x1-x2);
int m2 = abs(y1-y2);
// printf("%d %d %d %d\n", x1, y1, x2, y2);
if(!m1 && !m2) {
printf("0 0 0 0\n");
continue;
}
if(m1 > m2) swap(m1, m2);//m1 < m2
// cout << m1 << ends << m2 << endl;
ans = m2;
printf("%d ", ans);
if(!m1 || !m2 || m1 == m2) ans = 1;
else ans = 2;
printf("%d ", ans);
if(!m1 || !m2) ans = 1;
else ans = 2;
printf("%d ", ans);
if((m1+m2)%2) printf("Inf\n");
else {
if(m1 == m2) ans = 1;
else ans = 2;
printf("%d\n", ans);
}
}