一、Description
国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:
王、后、车、象的走子规则如下:
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
王、后、车、象的走子规则如下:
- 王:横、直、斜都可以走,但每步限走一格。
- 后:横、直、斜都可以走,每步格数不受限制。
- 车:横、竖均可以走,不能斜走,格数不限。
- 象:只能斜走,格数不限。
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
Input
第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。
Output
对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".
二、题解
目标:输出王、后、车、象从给定起点到终点坐标所需的最少步数。
方法:逐个分析。
王:输出横坐标差的绝对值与纵坐标差的绝对值的最大值。这个最大值是横坐标或纵坐标的最大差值,由于走一个斜着走一个相当于走一个横格和一个竖格。所以如果横格和竖格差的最小值可以有斜格代替,剩下的就走横格或竖格。
后:如果在同一斜线上或者同一行或者同一列上输出1,否则后可以通过两步到达任何坐标,输出2。
车:如果在同一行上或者同一列上则输出1,否则车可以通过两步到达任何坐标,输出2。
象:由于黑象只能走黑格,白象只走白格。所以如果起点与终点的颜色不同输出Inf,如果在同一斜线上则一步到达,输出1,否则任何坐标都可以通过一个中转到达 ,输出2。
注意:要提前分析起始和终点坐标相同的情况。如果相同则输出四个0,否则按上面的方法求。
三、Java代码
二、题解
目标:输出王、后、车、象从给定起点到终点坐标所需的最少步数。
方法:逐个分析。
王:输出横坐标差的绝对值与纵坐标差的绝对值的最大值。这个最大值是横坐标或纵坐标的最大差值,由于走一个斜着走一个相当于走一个横格和一个竖格。所以如果横格和竖格差的最小值可以有斜格代替,剩下的就走横格或竖格。
后:如果在同一斜线上或者同一行或者同一列上输出1,否则后可以通过两步到达任何坐标,输出2。
车:如果在同一行上或者同一列上则输出1,否则车可以通过两步到达任何坐标,输出2。
象:由于黑象只能走黑格,白象只走白格。所以如果起点与终点的颜色不同输出Inf,如果在同一斜线上则一步到达,输出1,否则任何坐标都可以通过一个中转到达 ,输出2。
注意:要提前分析起始和终点坐标相同的情况。如果相同则输出四个0,否则按上面的方法求。
三、Java代码
import java.util.Scanner; public class Main { static int k,q,c; static String e; public static void King(int x1, int y1, int x2, int y2){ int x = Math.abs(x1 - x2); int y = Math.abs(y1 - y2); if(x > y) k= x; else k= y; } public static void Queen(int x1, int y1, int x2, int y2){ if(x1 == x2 || y1 == y2|| directCon(x1, y1, x2, y2)) q= 1; else q= 2; } public static void Car(int x1, int y1, int x2, int y2){ if(x1 == x2 || y1 == y2) c= 1; else c= 2; } public static void Elephant(int x1, int y1, int x2, int y2){ e="2"; if((x1 + y1) % 2 != (x2 + y2) % 2) e="Inf"; if(directCon(x1, y1, x2, y2) == true) e= "1"; } public static boolean directCon(int x1, int y1, int x2, int y2){ if(Math.abs(x1-x2)==Math.abs(y1-y2)) return true; return false; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); String[] s=new String[2]; int x1,y1,x2,y2; int n=sc.nextInt(); while(n--!=0){ s[0]=sc.next(); s[1]=sc.next(); x1=s[0].charAt(0)-96; y1=s[0].charAt(1)-48; x2=s[1].charAt(0)-96; y2=s[1].charAt(1)-48; if(x1==x2 && y1==y2){ System.out.println(0+" "+0+" "+0+" "+0); }else{ King(x1, y1, x2, y2); Queen(x1, y1, x2, y2); Car(x1, y1, x2, y2); Elephant(x1, y1, x2, y2); System.out.println(k+" "+q+" "+c+" "+e); } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。