资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
RXY八数码
输入格式
输入两个3x3表格
第一个为目标表格
第二个为检索表格
输出格式
输出步数
样例输入
1 2 3
4 5 6
7 8 0
1 2 3
4 5 6
7 0 8
样例输出
1
数据规模和约定
3x3x2
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static int MAX=1000000;
private static int front=1,rear=2;
private static int[] dx= {-1,1,0,0};
private static int[] dy= {0,0,-1,1};
private static int[] fact=new int[10];
private static int[] dist=new int[MAX];
private static boolean[] vis=new boolean[3633000];
static class state{
int[] state=new int[10];
public state(int[] state) {
this.state = state;
}
}
private static state goal;
private static state[] st=new state[MAX];
private static int bfs() {
inits();
while(front<rear) {
state s=st[front];
if(Arrays.equals(s.state, goal.state)) {
return front;
}
int i;
for(i=0;i<9;i++) {
if(s.state[i]==0) {
break;
}
}
int x=i/3;
int y=i%3;
for(int d=0;d<4;d++) {
int x1=x+dx[d];
int y1=y+dy[d];
int i1=x1*3+y1;
if(x1>=0&&x1<3&&y1>=0&&y1<3) {
int[] t=Arrays.copyOf(s.state, 9);
st[rear]=new state(t);
st[rear].state[i1]=s.state[i];
st[rear].state[i]=s.state[i1];
dist[rear]=dist[front]+1;
if(insert(st[rear])) {
rear++;
}
}
}
front++;
}
return 0;
}
private static void inits() {
fact[0]=1;
for(int i=1;i<9;i++) {
fact[i]=fact[i-1]*i;
}
}
private static boolean insert(state s) {
int index=0;
for(int i=0;i<9;i++) {
int cnt=0;
for(int j=i+1;j<9;j++) {
if(s.state[j]<s.state[i]) {
cnt++;
}
}
index+=fact[8-i]*cnt;
}
if(vis[index]) {
return false;
}
else {
vis[index]=true;
return true;
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
dist[1]=0;
int[] a1=new int[9];
for(int i=0;i<9;i++) {
a1[i]=sc.nextInt();
}
st[1]=new state(a1);
int[] a2=new int[9];
for(int i=0;i<9;i++) {
a2[i]=sc.nextInt();
}
goal=new state(a2);
int ans=bfs();
System.out.println(dist[ans]);
sc.close();
}
}