• 九宫重排


    试题 历届试题 九宫重排

     
    【资源限制】 时间限制: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
     
  • 相关阅读:
    Linux服务器下载与上传文件
    Java代码实现定时器
    windows elasticsearch使用ik分词器插件后启动报错java.security.AccessControlException: access denied ("java.io.FilePermission" "D:...........pluginsik-analyzerconfigIKAnalyzer.cfg.xml" "read")
    windows elasticsearch搭集群启动失败failed to send join request to master....
    Oracle使用命令行登录提示ERROR: ORA-01017: invalid username/password; logon denied
    nrm : 无法加载文件 C:UsersTANGAppDataRoaming pm rm.ps1,因为在此系统上禁止运行脚本。
    Go 语言环境安装
    Go语言简介
    http 请求头的Cookie中的 JSESSIONID 是什么?
    什么是锚点?锚点有什么作用?
  • 原文地址:https://www.cnblogs.com/smk110/p/12561878.html
Copyright © 2020-2023  润新知