• 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);
    			  }
    		  }
          }  
     }     
      


     
         







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

  • 相关阅读:
    flink RECEIVED SIGNAL 15: SIGTERM. Shutting down as requested
    hive 正则
    scala.sys.process
    python多版本管理
    行式存储和列式存储
    Windows Latex 中日文字体设置例
    perl笔记
    wordpress plugins collection
    【转载】Windows 7下使用bcdedit删除多余启动项的命令
    修改MySQL密码
  • 原文地址:https://www.cnblogs.com/AndyDai/p/4734137.html
Copyright © 2020-2023  润新知