解题思路:
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 人评分