原题链接:魔板
解题思路:
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
public class Main {
static class Node { 队列节点
String s = null;
String step = null;
Node(String s, String step, char nc) {
this.s = s;
String ch = Character.toString(nc);
if (step != null)
this.step = step.concat(ch);
else
this.step = new String(ch);
}
Node(String s){
this.s = s;
}
}
public static String change(String s, int num) {
char[] resch = s.toCharArray();
//上下交换
if (num == 0) {
for (int i = 0; i <= 3; i++) {
char tmp = resch[i];
resch[i] = resch[7-i];
resch[7-i] = tmp;
}
return new String(resch);
}
//右移交换
else if (num == 1) {
char tmp = resch[3];
for (int i = 3; i > 0; i--)
resch[i] = resch[i-1];
resch[0] = tmp;
tmp = resch[4];
for (int i = 4; i < 7; i++)
resch[i] = resch[i+1];
resch[7] = tmp;
return new String(resch);
}
//顺时针交换
else {
char tmp = resch[2];
resch[2] = resch[1];
resch[1] = resch[6];
resch[6] = resch[5];
resch[5] = tmp;
return new String(resch);
}
}
public static void main(String args[]){
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
Queue<Node> queue = new LinkedList<>();
//用hash表避免超时,再加上状态压缩内存好看点
//因为各个数字不同,所以最后一位可忽略
boolean[] hash = new boolean[8765433];
String aim = new String(input.next());
queue.offer(p);
hash[Integer.valueOf(p.s) / 10] = true;
while (!queue.isEmpty()) {
Node first = queue.poll(); /出队
if (first.s.compareTo(aim) == 0) {
System.out.println(first.step);
break;
}
for (int i = 0; i < 3; i++) {
String tmp = change(first.s, i);
int tmpi = Integer.valueOf(tmp) / 10; //状态压缩
if (!hash[tmpi]) {
queue.offer(new Node(tmp, first.step, (char)(i + 'A')));
hash[tmpi] = true;
}
}
}
}
}
}
注意事项:
参考代码:
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复