问题描述

  如下面第一个图的九宫格中,放着 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();
}
}

Java实现 蓝桥杯 历届试题 九宫重排的更多相关文章

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

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

  2. Java实现蓝桥杯历届试题分考场

    历届试题 分考场 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 n个人参加某项特殊考试. 为了公平,要求任何两个认识的人不能分在同一个考场. 求是少需要分几个考场才能满足条件. 输 ...

  3. Java实现蓝桥杯历届试题兰顿蚂蚁

    历届试题 兰顿蚂蚁 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其 ...

  4. Java实现蓝桥杯历届试题回文数字

    历届试题 回文数字 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做: ...

  5. Java实现蓝桥杯历届试题高僧斗法

    历届试题 高僧斗法 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以 ...

  6. Java实现蓝桥杯历届试题买不到的数目

    历届试题 买不到的数目 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友 ...

  7. Java实现 蓝桥杯 历届试题 斐波那契

    试题 历届试题 斐波那契 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 - (x=1,2) f(x) = f(x-1) ...

  8. Java实现 蓝桥杯 历届试题 小计算器

    历届试题 小计算器 时间限制:1.0s 内存限制:256.0MB 问题描述 模拟程序型计算器,依次输入指令,可能包含的指令有 1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个 ...

  9. Java实现蓝桥杯 历届试题 k倍区间

    历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...

随机推荐

  1. easytornado

    0x01 进入网站,发现3个文件 逐一查看 flag.txt url:?filename=/flag.txt&filehash=d3f3ff3f92c98f5f0ff4b8c423e1c588 ...

  2. 系统学习scala--基础

    scala基础 安装scala(不推荐使用最新版本,2.11.x够用了) scala官网 2.11.12版本下载页面 这里我选择2.11.12版本,在下载页面往下拉,选择scala-2.11.12.m ...

  3. .Net Core3.0 WebApi 项目框架搭建 二:API 文档神器 Swagger

    .Net Core3.0 WebApi 项目框架搭建:目录 为什么使用Swagger 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.后端分离的形态,而且前端技术和后端技 ...

  4. logback如何配置springboot框架

    创建logback-spring.xm在src/main/resources下面(springboot推荐使用logback-spring.xml而不是logback.xml)文件. logback- ...

  5. dede搜索页做法

    触发搜索页代码 <p class="fl"> <span>热门搜索:</span> {dede:hotwords num=8 subday=36 ...

  6. Vue全局组件创建三种方法

    <my-com1></my-com1> <my-com2></my-com2> <template id="tmp1"> ...

  7. oracle 多表连接查询 join

    转 简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...

  8. Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序

    1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...

  9. 利用pandas进行数据子集的获取

  10. Xftp远程连接出现“无法显示文件夹”的问题补充

    网上有很多朋友出现相同的问题,各位热心网友都给出了自己的解决方案,其中大多数网友给出的解决方案都是:将Xftp更换成“被动连接模式”.但是很不幸的是,本人通过这种方式并没有得到有效的解决,网上的各大方 ...