搜索--hiho 骑士问题


描述

小Hi:小Ho你会下国际象棋么?

小Ho:应该算会吧,我知道每个棋子的移动方式,马走日象飞田什么的...

小Hi:象飞田那是中国象棋啦!

小Ho:哦,对。国际象棋好像是走斜线来着。

小Hi:不过马走日倒是对了。国际象棋中的马一般叫做骑士,关于它有个很有意思的问题。

小Ho:什么啊?

小Hi:骑士巡游问题,简单来说就是关于在棋盘上放置若干个骑士,然后探究移动这些骑士是否能满足一定的而要求。举个例子啊:一个骑士从起始点开始,能否经过棋盘上所有的格子再回到起点。

小Ho:哦,看上去好像很难的样子。

小Hi:其实也还好了。简单一点的比如棋盘上有3个骑士,能否通过若干次移动走到一起。

小Ho:能够么?

小Hi:当然能够了。由于骑士特殊的移动方式,放置在任何一个初始位置的骑士,都可以通过若干次移动到达棋盘上任意一个位置。

小Ho:那么只要选定一个位置,把它们全部移动过去就好了是吧?

小Hi:是的,那么这里又有另一个问题了:要选择哪一个位置汇合,使得3个骑士行动的总次数最少?

小Ho:嗯,这个好像不是很难,让我想一想。

 

输入

第1行:1个正整数t,表示数据组数,2≤t≤10。

第2..t+1行:用空格隔开的3个坐标, 每个坐标由2个字符AB组成,A为'A'~'H'的大写字母,B为'1'~'8'的数字,表示3个棋子的初始位置。

输出

第1..t行:每行1个数字,第i行表示第i组数据中3个棋子移动到同一格的最小行动步数。

样例输入

2
A1 A1 A1
B2 D3 F4

样例输出

0
2


提示方法:
package tecent;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class qishihiho {
    public static int[][] move  = {{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2}};
    
    static class cordinate{
        int x;
        int y;
        public cordinate(int i,int j) {
            // TODO Auto-generated constructor stub
            x=i;
            y=j;
        }
    }
    public static void main(String args[]){
        int  f [][][] = new int[3][8][8]; 
        Scanner sc  =  new Scanner(System.in);
        int a = sc.nextInt();
        String kong =sc.nextLine();
      for(int k=0;k<a;k++){
            String str = sc.nextLine();
            String str1 []= str.split(" ");
            for(int j=0;j<3;j++){
                cordinate cor = new qishihiho.cordinate(str1[j].charAt(0)-'A', str1[j].charAt(1)-'1');
                //System.out.println(cor.x+"  "+cor.y);
                bfs(cor,f[j]);
            }
            int ans = Integer.MAX_VALUE;
            for(int m=0;m<8;m++){
                for(int n=0;n<8;n++){
                    int len=0;
                    for(int i=0;i<3;i++){
                        len+=f[i][m][n];
                    }
                    if(len<ans)
                        ans=len;
                }
            }
            System.out.println(ans);
            
            
        }
    }
    
    public static void bfs(cordinate point,int [][] f){
        
        //初始化
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                f[i][j] =-1;
            }
        }
        f[point.x][point.y] =0;
        
        Queue<cordinate> poi = new LinkedList<>();
        poi.add(point);
        while(!poi.isEmpty()){
            cordinate temp = poi.poll();
            for(int i=0;i<8;i++){
                cordinate next = new cordinate(temp.x+move[i][0], temp.y+move[i][1]);
                if(inBoard(next)&&f[next.x][next.y]==-1){
                    f[next.x][next.y]=f[temp.x][temp.y]+1;
                    poi.add(next);
                    
                }
                
            }
        }
    }
    
    //是否在棋盘内(8*8的棋盘)
    public static boolean inBoard(cordinate cor){
         if(cor.x<0||cor.y<0||cor.x>7||cor.y>7) return false;
         else  return true;
    }
    
    

}
原文地址:https://www.cnblogs.com/CongLollipop/p/6672652.html