🍑 算法题解专栏
🍑 魔板
输入
2 6 8 4 5 7 3 1
输出
7
BCABCCB
🍑 操作函数(一维数组表示魔板状态)
🍑 字符串比较:String.equals(String a)
import java.util.*;
public class Main
{
static String end;
static class Pair
{
char[] now;
String path;
public Pair(char[] now, String path)
{
super();
this.now = now;
this.path = path;
}
}
static void bfs()
{
String start = "12345678";
if (start.equals(end))
{
System.out.println(0);
return;
}
char[] sta = start.toCharArray();
HashSet<String> set = new HashSet<>();
LinkedList<Pair> q = new LinkedList<>();
set.add(start);
q.add(new Pair(sta, ""));
while (!q.isEmpty())
{
Pair t = q.poll();
char[] cc = t.now;
String path = t.path;
// System.out.println(String.valueOf(cc) + " " + path);
// if (q.size() == 1)
// System.out.println("debug");
for (char i = 'A'; i <= 'C'; i++)
{
String ss = op(i, cc);
if (set.contains(ss))
continue;
set.add(ss);
String newPath = path + i;
// System.out.println(String.valueOf(cc) + " " + i + " " + ss);
// System.out.println(newPath);
q.add(new Pair(ss.toCharArray(), newPath));
if (ss.equals(end))
{
int len = newPath.length();
System.out.println(len);
if (len > 0)
System.out.println(newPath);
return;
}
}
}
}
static String op(char type, char[] cc)
{
char[] ans = new char[8];
if (type == 'A')
{
ans[0] = cc[7];
ans[1] = cc[6];
ans[2] = cc[5];
ans[3] = cc[4];
ans[4] = cc[3];
ans[5] = cc[2];
ans[6] = cc[1];
ans[7] = cc[0];
} else if (type == 'B')
{
ans[0] = cc[3];
ans[1] = cc[0];
ans[2] = cc[1];
ans[3] = cc[2];
ans[4] = cc[5];
ans[5] = cc[6];
ans[6] = cc[7];
ans[7] = cc[4];
} else if (type == 'C')
{
ans[0] = cc[0];
ans[1] = cc[6];
ans[2] = cc[1];
ans[3] = cc[3];
ans[4] = cc[4];
ans[5] = cc[2];
ans[6] = cc[5];
ans[7] = cc[7];
}
// System.out.println(String.valueOf(ans));
return String.valueOf(ans);
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
end = line.replaceAll(" ", "");
// System.out.println(end);
bfs();
}
}