无聊君


私信TA

用户名:qq2652239948

访问量:1962

签 名:

不想努力只想摆

等  级
排  名 1147
经  验 3152
参赛次数 1
文章发表 2
年  龄 0
在职情况 学生
学  校 加里敦大学
专  业 软件与信息服务

  自我简介:

The art challenges the technology, and the technology inspires the art. 艺术挑战技术,技术启发艺术。

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

8 人评分

  评论区

很顶!!!
2023-11-23 17:31:21
真顶!!!
2022-01-19 10:55:23
真厉害
2022-01-19 10:54:01
  • «
  • 1
  • »