密码由4位组成,每个数字为1-9,每次操作可以对任意一位加1,减一,相邻两位交换(0和3不相邻),求最少次数开锁。
java的对象=是引用,B=A,改变B的值会引起A的改变,这点要注意,不然bfs会出问题。(java对象的复制)
输入:1234
2144
输出:2
代码如下:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class L4 {
static Nod first = new Nod();
static Nod last = new Nod();
// static Nod next = new Nod();
static boolean[][][][] vis = new boolean[11][11][11][11];
public static Nod clo(Nod a) {
Nod b = new Nod();
b.num[0] = a.num[0];
b.num[1] = a.num[1];
b.num[2] = a.num[2];
b.num[3] = a.num[3];
b.step = a.step;
return b;
}
static void bfs() {
Nod a, next;
a = clo(first);
a.step = 0;
Queue<Nod> q = new LinkedList<>();
q.offer(a);
vis[a.num[0]][a.num[1]][a.num[2]][a.num[3]] = true;
while (!q.isEmpty()) {
a = q.poll();
// bfs出口
if (a.num[0] == last.num[0] && a.num[1] == last.num[1] && a.num[2] == last.num[2]
&& a.num[3] == last.num[3]) {
System.out.println(a.step);
return;
}
for (int i = 0; i < 4; i++) {
next = clo(a);
next.num[i]++;
if (next.num[i] == 10) {
next.num[i] = 1;
}
if (!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]) {
vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = true;
next.step++;
q.offer(next);
}
}
for (int i = 0; i < 4; i++) {
next = clo(a);
next.num[i]--;
if (next.num[i] == 0) {
next.num[i] = 9;
}
if (!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]) {
vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = true;
next.step++;
q.offer(next);
}
}
for (int i = 0; i < 3; i++) {
next = clo(a);
next.num[i] = a.num[i + 1];
next.num[i + 1] = a.num[i];
if (!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]) {
vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = true;
next.step++;
q.offer(next);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String a = sc.next();
String b = sc.next();
for (int i = 0; i < 4; i++) {
first.num[i] = a.charAt(i) - '0';
last.num[i] = b.charAt(i) - '0';
System.out.println(first.num[i] + " " + last.num[i]);
}
bfs();
}
}
class Nod {
int[] num = new int[4];
int step;
}