九宫重排
作者:互联网
试题 历届试题 九宫重排
【资源限制】 时间限制:1.0s 内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。 输入格式 输入第一行包含九宫的初态,第二行包含九宫的终态。 输出格式 输出最少的步数,如果不存在方案,则输出-1。 样例输入 12345678.
123.46758 样例输出 3 样例输入 13524678.
46758123. 样例输出 22
一开始不仔细,想用dfs解,没找到结束条件,于是百度,发现bfs更适合(以前bfs没认真学),于是改用bfs(确实傻,这题明摆着求最短距离就是用bfs)。
题目分析
1.因为是求最短距离,所以需要用bfs。
2.因为走的方向有很多,可能这一步从前走过,所以要把每一种形态都存储下来,所以要用到hashmap
3.直接使用字符串处理,不必再转为数组(徒增功耗)找到.的位置 -3表示向上移动 ,+3向上移动 , -1向左移动,+1向右移动,注意需要排除错误的移动:2和3 或者5和6 的移动是错误的
AC代码
1 package LQ; 2 3 import java.util.HashMap; 4 import java.util.LinkedList; 5 import java.util.Map; 6 import java.util.Queue; 7 import java.util.Scanner; 8 9 10 public class 九宫重排{ 11 12 public static void main(String[] args) { 13 Map<String, Integer> map = new HashMap<String, Integer>();//存放串 与 步长 14 Queue<String> queue = new LinkedList<String>(); 15 int result = -1; 16 Scanner scanner = new Scanner(System.in); 17 String source = scanner.nextLine(); 18 String aid = scanner.nextLine(); 19 queue.offer(source); 20 map.put(source, 0); 21 22 int[] move = {-3,3,-1,1};//上下左右 23 while (result==-1) { 24 String str = queue.poll();//拿出队首元素处理 25 if (str==null) break;//队列空,结束循环 26 int locate = str.indexOf("."); 27 28 for (int i = 0; i <=3; i++) { 29 int locate2 = locate+move[i]; 30 31 if ((locate2==2&&locate==3)||(locate2==5&&locate==6)||(locate==2&&locate2==3)||(locate==5&&locate2==6))continue; //排除错误移动 32 33 if (locate2>=0&&locate2<=8) { 34 String str2 = str; 35 //两个字符交换 36 char t = str2.charAt(locate2); 37 str2 = str2.replace('.', '0'); 38 str2 = str2.replace(t, '.'); 39 str2 = str2.replace('0', t); 40 if (str2.equals(aid)) { 41 result = map.get(str)+1; 42 break; 43 } 44 if (!map.containsKey(str2)) { 45 map.put(str2, map.get(str)+1); 46 queue.offer(str2); 47 } 48 } 49 } 50 } 51 52 System.out.println(result); 53 } 54 }View Code
标签:util,java,bfs,重排,import,移动,九宫 来源: https://www.cnblogs.com/smk110/p/12561878.html