原题链接:蓝桥杯历届试题-九宫重排
解题思路:
一道简单的BFS(广度优先搜索)题目,套模板可直接解题
与输入地图的题目一样,只是将地图的位移数组
上 -1,0
下 1,0
左 0,-1
右 0,1
改为在字符串中模拟地图位移数组
上 -3
下 3
左 -1
右 1
注意事项:
虽然题目给的是一个3×3的地图
但是输入的是一个字符串
给出了开始和结束的情况
参考代码:
import java.util.LinkedList;
import java.util.Scanner;
import java.util.TreeSet;
public class 九宫重排 {
private static class BFSNode {
public String state;
public int step;
public BFSNode(String state, int step) {
this.state = state;
this.step = step;
}
}
//开头
public static void main(String[] args) {
//接收
Scanner sr = new Scanner(System.in);
String start = sr.nextLine();
String end = sr.nextLine();
//建立队列
LinkedList q = new LinkedList();
TreeSet ts = new TreeSet();
BFSNode root = new BFSNode(start, 0);
//表头
q.add(root);
//查重放入表头
ts.add(start);
//移动数据的数组
int[] move = new int[] { -3, -1, 1, 3 };
//开始循环
while (!q.isEmpty()) {
//出队
BFSNode currentNode = q.remove();
//判断是否与输入的结果相同
if (currentNode.state.equals(end)) {
System.out.println(currentNode.step);
break;
}
//判断当前 “.” 的位置
int newkwz = currentNode.state.indexOf(".");
//算出子节点
for (int i = 0; i < move.length; i++) {
//记录位置与移动数组结合后的位置
int toto = newkwz + move[i];
//判断数字交换是否符合交换规则
if ( toto > 8 || toto < 0 ||
(newkwz == 3 && move[i] == -1) || (newkwz == 5 && move[i] == 1) ||
(newkwz == 2 && move[i] == 1) || (newkwz == 6 && move[i] == -1) ) {
toto = 0;
continue;
}
//将字符串拆解进数组
char[] arr = currentNode.state.toCharArray();
//数组交换位置
char temp = arr[newkwz];
arr[newkwz] = arr[toto];
arr[toto] = temp;
//数组转换回字符串
String newState = new String(arr);
//查重 如果成功放入 TreeSet 中 将子节点放入列表 并且步数+1
if (ts.add(newState)) {
q.add(new BFSNode(newState, currentNode.step + 1));
}
}
}
//如果 循环结束并且队列为空 输出-1(没有方案可以转换到当前位置)
if (q.isEmpty()) {
System.out.println(-1);
}
}
}0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复