算法笔记_183:历届试题 九宫重排(Java)
目录
1 问题描述
2 解决方案
1 问题描述
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
123.46758
46758123.
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)相关推荐
- 算法笔记_172:历届试题 波动数列(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...
- java九宫排序,蓝桥杯 历届试题 九宫重排 java
list = new ArrayList(); list.add(new Move(x1,y1,0,start));//添加初始状态进入list set.add(start);//添加初始字符串进入s ...
- 算法笔记_188:历届试题 危险系数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点 ...
- 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- 历届试题 九宫重排 广度优先搜索+康拓排序
历届试题 九宫重排 时间限制:1.0s 内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移 ...
- 蓝桥杯 历届试题 九宫重排
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- [蓝桥杯][历届试题]九宫重排-双向bfs和map标记
题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- 蓝桥杯 历届试题 九宫重排
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
最新文章
- Android 人脸识别
- Android蓝牙开发前序知识
- BootStrap学习笔记,优缺点总结
- 802.11协议中帧控制域中To DS and From DS 比特位的含义
- 常用SQL语句书写技巧-
- Java Ajax jsonp 跨域请求
- 学JAVA要学redis_新手学习Java对Redis简单操作
- linux日志删除1天前,Linux自动删除n天前日志
- 关于android中的ramdisk.img及uImage无法包含驱动模块(*.ko)的问题
- sap期初导资产代码_SAP S/4固定资产导入期初科目设置
- 贵阳学院教务管理系统服务器,贵阳学院教务处,教务网络管理系统
- js 下载文件、音频、视频
- java 分布式任务_分布式定时任务(一)
- 更改C盘用户目录下的文件夹名称
- rf 遍历列表_RF之关键字、变量、循环
- Matlab2013a学习之男女的声音识别
- The request was rejected because the URL contained a potentially malicious String “;“问题的正确解决姿势
- html雪碧图怎么设置,HTML 5开发的在线雪碧图片合成工具
- cisco asa(asa5510 设置)防火墙的配置详解
- 为什么在java中-(2的31次方)*(-1)还是-(2的31次方)(也就是-2147483648)?