历届试题 九宫重排
题目描述
如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
输入
输入第一行包含九宫的初态,第二行包含九宫的终态。
输出
输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
public class Main {
static char[][] graph = new char[3][3];
static int n = 9;
static Queue<JGNode> q;
static String s1;
static String s2;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
s1 = sc.next();
s2 = sc.next();
for (int i = 0; i < 3; i++) {
graph[i] = s1.substring(i*3, (i*3)+3).toCharArray();
}
q = new LinkedList<JGNode>();
for (int i = 0; i < graph.length; i++) {
for (int j = 0; j < graph.length; j++) {
if(graph[i][j] == '.'){
q.add(new JGNode(s1,0,i,j));
}
}
}
bfs();
}
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
private static void bfs() {
Set<String> set = new HashSet<>();
while(!q.isEmpty()){
JGNode node = q.poll();
int x = node.x;
int y = node.y;
String data = node.data;
int dept = node.dept;
set.add(data);
if(data.equals(s2)){
System.out.println(dept);
return;
}
for (int i = 0; i < 4; i++) {
int nx = x+dx[i];
int ny = y+dy[i];
if(nx >= 0 && nx < 3 && ny >= 0&& ny < 3){
for (int i1 = 0; i1 < 3; i1++) {
graph[i1] = data.substring(i1*3, (i1*3)+3).toCharArray();
}
char c = graph[x][y];
graph[x][y] = graph[nx][ny];
graph[nx][ny] = c;
String str ="";
for (int ii = 0; ii < graph.length; ii++) {
for (int j = 0; j < graph.length; j++) {
str += graph[ii][j];
}
}
if(!set.contains(str)){
set.add(str);
q.add(new JGNode(str,dept+1,nx,ny));
}
c = graph[x][y];
graph[x][y] = graph[nx][ny];
graph[nx][ny] = c;
}
}
}
System.out.println(-1);
}
}
class JGNode{
String data;
int dept;
int x ;
int y;
public JGNode(String data, int dept, int x, int y) {
super();
this.data = data;
this.dept = dept;
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "JGNode [data=" +data
+ ", dept=" + dept + ", x=" + x + ", y=" + y + "]";
}
}