目录

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. 算法笔记_177:历届试题 城市建设(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有 ...

  2. 算法笔记_186:历届试题 高僧斗法(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地 ...

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

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

  4. 算法笔记_196:历届试题 剪格子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|**** ...

  5. 算法笔记_195:历届试题 错误票据(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为 ...

  6. 算法笔记_194:历届试题 翻硬币(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情 ...

  7. 算法笔记_190:历届试题 幸运数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成 . 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第 ...

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

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

  9. 算法笔记_187:历届试题 网络寻路(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任 ...

随机推荐

  1. linux内核 asmlinkage宏

    http://blog.chinaunix.net/uid-7390305-id-2057287.html

  2. TCP半连接和syn攻击(转)

    TCP半连接和syn攻击 转载 2014年04月06日 21:36:10 4243 摘自:http://blog.sina.com.cn/s/blog_54b5ea250100g2r8.html SY ...

  3. SRM 624 D2L3: GameOfSegments, 博弈论,Sprague–Grundy theorem,Nimber

    题目:http://community.topcoder.com/stat?c=problem_statement&pm=13204&rd=15857 这道题目须要用到博弈论中的经典理 ...

  4. Struts2 无后缀action请求

    如果将Struts2的filter-mapping配置成 <filter-mapping> <filter-name>struts2</filter-name> & ...

  5. latex用法疑难解析

    latex用法疑难解析 1.问题:如何生成ps(PostScript)文件? 回答: 方法有二 (1)用dvips这个工具,在WinEdt编辑器中专门有一个按钮: (2)如果使用windows系统的话 ...

  6. JavaBean的应用

    1. 获取JavaBean属性信息 例1.1 在JSP页面中显示JavaBean属性信息. (1)创建名称为Produce的类,该类是封装商品对象的JavaBean,在Produce类中创建商品属性, ...

  7. JMS基本概念之一

    The Java Message Service(JMS) API is a messaging standard that allows application components based o ...

  8. [Python爬虫]煎蛋网OOXX妹子图爬虫(1)——解密图片地址

    之前在鱼C论坛的时候,看到很多人都在用Python写爬虫爬煎蛋网的妹子图,当时我也写过,爬了很多的妹子图片.后来煎蛋网把妹子图的网页改进了,对图片的地址进行了加密,所以论坛里面的人经常有人问怎么请求的 ...

  9. PL/SQL Developer连接64位Oracle

    在64位系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其他途径来完 ...

  10. Length of Last Word leetocde java

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...