解题思路:
一道简单的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.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

alex 1年前 回复TA
很顶!!!
廾匸 3年前 回复TA
真顶!!!
Binc77 3年前 回复TA
真厉害