搜索--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; } }