原题链接:蓝桥杯历届试题-九宫重排
解题思路:
注意事项:
参考代码:
import java.util.HashSet; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class T1426 { static int[][] dir = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }; public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String begin = in.next(), end = in.next(); int t = begin.indexOf("."); Queue<State> queue = new LinkedList<State>(); queue.offer(new State(begin, t / 3, t % 3, 0)); HashSet<String> set = new HashSet<String>(); set.add(begin); int ans = 0; s: while (!queue.isEmpty()) { State tmp = queue.poll(); for (int i = 0; i < 4; i++) { int tx = tmp.x + dir[i][0], ty = tmp.y + dir[i][1]; if (tx >= 0 && tx < 3 && ty >= 0 && ty < 3) { StringBuilder sb = new StringBuilder(tmp.s); char c = sb.charAt(3 * tx + ty); sb.setCharAt(3 * tx + ty, sb.charAt(3 * tmp.x + tmp.y)); sb.setCharAt(3 * tmp.x + tmp.y, c); String str = sb.toString(); if (str.equals(end)) { ans = tmp.cnt + 1; break s; } if (!set.contains(str)) { set.add(str); queue.offer(new State(sb.toString(), tx, ty, tmp.cnt + 1)); } } } } System.out.println(ans); } in.close(); } } class State { String s; int x, y; int cnt; public State(String s, int x, int y, int cnt) { super(); this.s = s; this.x = x; this.y = y; this.cnt = cnt; } }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复