zoukankan      html  css  js  c++  java
  • 搜索--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;
        }
        
        
    
    }
  • 相关阅读:
    MySQLdb使用
    common Lisp学习笔记(十二)
    Common Lisp学习笔记(十一)
    Common Lisp学习笔记(十)
    tornado学习笔记(四)
    tornado学习笔记(三)
    tornado学习笔记(二)
    tornado学习笔记(一)
    Common Lisp学习笔记(九)
    探秘Java中的String、StringBuilder以及StringBuffer
  • 原文地址:https://www.cnblogs.com/CongLollipop/p/6672652.html
Copyright © 2011-2022 走看看