Poj 1659 Distance on Chessboard(国际象棋的走子规则)

一、Description

国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:

王、后、车、象的走子规则如下:
  • 王:横、直、斜都可以走,但每步限走一格。
  • 后:横、直、斜都可以走,每步格数不受限制。
  • 车:横、竖均可以走,不能斜走,格数不限。
  • 象:只能斜走,格数不限。


写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。

Input

第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。

Output

对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".
二、题解
        目标:输出王、后、车、象从给定起点到终点坐标所需的最少步数。
        方法:逐个分析。
                    王:输出横坐标差的绝对值与纵坐标差的绝对值的最大值。这个最大值是横坐标或纵坐标的最大差值,由于走一个斜着走一个相当于走一个横格和一个竖格。所以如果横格和竖格差的最小值可以有斜格代替,剩下的就走横格或竖格。           
                    后:如果在同一斜线上或者同一行或者同一列上输出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);
			  }
		  }
      }  
 }     
  


 
     







版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/AndyDai/p/4734137.html