目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述
  如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。

  我们把第一个图的局面记为:12345678.
  把第二个图的局面记为:123.46758
  显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
  本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
输入格式
  输入第一行包含九宫的初态,第二行包含九宫的终态。
输出格式
  输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3
样例输入
13524678.
46758123.
样例输出
22

2 解决方案

本题下面代码参考自文末参考资料,本题的核心使用BFS求解,其中要求最小移动次数,在BFS遍历中,第一次达到匹配时就是最小移动次数,这个不好证明,不过可以自己细细想想,应该是这样。

该版本的C++版是100分,Java版为60分。

具体代码如下:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;public class Main {public static String start, end;public static int x1, y1;   //起始就空格状态start中的空格子坐标public static int[][] move = {{-1,0},{1,0},{0,-1},{0,1}};//表示分别向上、下、左、右移动一步public static HashSet<String> set = new HashSet<String>(); //用于存放每次移动空格子后的结果,用于判重static class Move {  //内部类,存放空格子移动一步后的结果public int x;   //空格子位置横坐标public int y;   //空格子纵坐标移动步数public int step;  //记录最终public String temp;  //当前九宫格状态public Move(int x, int y, int step, String temp) {this.x = x;this.y = y;this.step = step;this.temp = temp;}}public void bfs() {for(int i = 0;i < start.length();i++) {   //寻找九宫格初始状态空格子的位置if(start.charAt(i) == '.') {x1 = i / 3;y1 = i % 3;}}ArrayList<Move> list = new ArrayList<Move>();list.add(new Move(x1, y1, 0, start));    set.add(start);while(!list.isEmpty()) {Move now = list.get(0);list.remove(0);if(now.temp.equals(end)) {     //当前状态为最终状态时,直接退出
                System.out.println(now.step);return;}for(int i = 0;i < 4;i++) {   //四种行走方案int x = now.x + move[i][0];int y = now.y + move[i][1];if(x < 0 || x > 2 || y < 0 || y > 2)  //出现九宫格越界continue;int step = now.step + 1;char n = now.temp.charAt(x * 3 + y);   //获取当前行走的新位置字符String temp0 = now.temp;temp0 = temp0.replace(n, '-');   //交换'.'字符和n字符temp0 = temp0.replace('.', n);temp0 = temp0.replace('-', '.');    if(!set.contains(temp0)) {  //判定当前行走结果是否已经行走过
                    set.add(temp0);list.add(new Move(x, y, step, temp0));}}}System.out.println("-1");return;}public static void main(String[] args) {Main test = new Main();Scanner in = new Scanner(System.in);start = in.next();  //九宫格的初始状态end = in.next();   //九宫格的最终状态
        test.bfs();}
}

参考资料:

1.蓝桥杯 历届试题 九宫重排 (广搜)

算法笔记_183:历届试题 九宫重排(Java)相关推荐

  1. 算法笔记_172:历届试题 波动数列(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...

  2. java九宫排序,蓝桥杯 历届试题 九宫重排 java

    list = new ArrayList(); list.add(new Move(x1,y1,0,start));//添加初始状态进入list set.add(start);//添加初始字符串进入s ...

  3. 算法笔记_188:历届试题 危险系数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点 ...

  4. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  5. 历届试题 九宫重排 广度优先搜索+康拓排序

    历届试题 九宫重排   时间限制:1.0s   内存限制:256.0MB        问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移 ...

  6. 蓝桥杯 历届试题 九宫重排

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  7. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  8. [蓝桥杯][历届试题]九宫重排-双向bfs和map标记

    题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  9. 蓝桥杯 历届试题 九宫重排

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

最新文章

  1. Android 人脸识别
  2. Android蓝牙开发前序知识
  3. BootStrap学习笔记,优缺点总结
  4. 802.11协议中帧控制域中To DS and From DS 比特位的含义
  5. 常用SQL语句书写技巧-
  6. Java Ajax jsonp 跨域请求
  7. 学JAVA要学redis_新手学习Java对Redis简单操作
  8. linux日志删除1天前,Linux自动删除n天前日志
  9. 关于android中的ramdisk.img及uImage无法包含驱动模块(*.ko)的问题
  10. sap期初导资产代码_SAP S/4固定资产导入期初科目设置
  11. 贵阳学院教务管理系统服务器,贵阳学院教务处,教务网络管理系统
  12. js 下载文件、音频、视频
  13. java 分布式任务_分布式定时任务(一)
  14. 更改C盘用户目录下的文件夹名称
  15. rf 遍历列表_RF之关键字、变量、循环
  16. Matlab2013a学习之男女的声音识别
  17. The request was rejected because the URL contained a potentially malicious String “;“问题的正确解决姿势
  18. html雪碧图怎么设置,HTML 5开发的在线雪碧图片合成工具
  19. cisco asa(asa5510 设置)防火墙的配置详解
  20. 为什么在java中-(2的31次方)*(-1)还是-(2的31次方)(也就是-2147483648)?

热门文章

  1. 训练超大规模图模型,PyTorchBigGraph如何做到?
  2. SAP PLM 进阶 2 – 主要核心功能
  3. CVPR2020人脸防伪检测挑战赛冠亚军论文解读(下篇)
  4. AI时代,产品经理需要掌握的5项新技能
  5. AI安防落地靠什么?大规模生产是关键
  6. 科技贡献新力量:无人驾驶清扫车上路
  7. 解码以色列人工智能产业:正在崛起的竞争者
  8. 条件随机场CRF HMM,MEMM的比较
  9. SAP MM MM17里不能修改物料主数据'Purchasing Value Key'字段值?
  10. torch.tensordot()介绍