九宫重排

试题 历届试题 九宫重排

 
【资源限制】 时间限制: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

 

 

 
posted @ 2020-03-24 20:58  啊好没吃呢  阅读(247)  评论(0编辑  收藏  举报