将三个操作写成三个函数操作。
注意必须使用Set对魔方出现的情况进行去重,否则会MLE
import java.util.*;
public class Main {
static int[] a=new int[8];
static Set<String> set=new HashSet<>();
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
for (int i = 0; i < 8; i++) {
a[i]=sc.nextInt();
}
int[] b={1,2,3,4,5,6,7,8};
String sb="";
Queue<PII> queue=new LinkedList<>();
queue.offer(new PII(b,sb));
int tmp=0;
while (!queue.isEmpty()){
int size=queue.size();
while (size-->0){
PII pii=queue.poll();
if (check(pii.b)){
System.out.println(tmp);
if (tmp!=0) System.out.println(pii.s);
return;
}
int[] s1=Arrays.copyOfRange(pii.b,0,8);
int[] s2=Arrays.copyOfRange(pii.b,0,8);
int[] s3=Arrays.copyOfRange(pii.b,0,8);
A(s1);
B(s2);
C(s3);
if (!set.contains(Arrays.toString(s1))){
queue.offer(new PII(s1,pii.s+"A"));
set.add(Arrays.toString(s1));
}
if (!set.contains(Arrays.toString(s2))){
queue.offer(new PII(s2,pii.s+"B"));
set.add(Arrays.toString(s2));
}
if (!set.contains(Arrays.toString(s3))){
queue.offer(new PII(s3,pii.s+"C"));
set.add(Arrays.toString(s3));
}
}
tmp++;
}
}
static void A(int[] b){
exch(b,0,7);
exch(b,1,6);
exch(b,2,5);
exch(b,3,4);
}
static void B(int[] b){
int x=3,y=4;
for (int i = 0; i <3; i++) {
exch(b,x,x-1);
exch(b,y,y+1);
x--;
y++;
}
}
static void C(int[] b){
exch(b,5,2);
exch(b,2,1);
exch(b,1,6);
}
static boolean check(int[] b){
for (int i = 0; i < 8; i++) {
if (b[i]!=a[i]) return false;
}
return true;
}
static void exch(int[] b,int i,int j){
int tmp=b[i];
b[i]=b[j];
b[j]=tmp;
}
static class PII {
int[] b;
String s;
public PII(int[] b, String s) {
this.b = b;
this.s = s;
}
}
}
是你吗,执梗哥
全网独一无二的执梗哈哈哈