原题链接:蓝桥杯历届试题-九宫重排
解题思路:
注意事项:
参考代码:
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复