https://leetcode.com/problems/sliding-puzzle/submissions/1
题目大意:类似华容道游戏,2*3的格子给你12345 5个数和一个0,0表示空格,问初始状态经过最少多少次移动变成123450的终态。
解题思路:BFS搜索,需要注意 记录每种状态
class Solution {
private int cal(int[][] a)
{
int res=0;
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a[i].length;j++)
{
res=res*10 + a[i][j];
}
}
return res;
}
private void swap(int[][] a,int x,int y,int xx,int yy){
// for (int i=0;i<2;i++) {
// for (int j=0;j<3;j++) {
// System.out.print(a[i][j]+" ");
// }
// System.out.println();
// }
// System.out.println(x+" "+y+" "+xx+" "+yy);
int t = a[x][y];
a[x][y] = a[xx][yy];
a[xx][yy] = t;
}
private int[] dx={1,-1,0,0};
private int[] dy={0,0,1,-1};
public int slidingPuzzle(int[][] board) {
int[] vis = new int[555555];
Arrays.fill(vis,0);
int endStatus = 123450;
int startStatus = cal(board); vis[startStatus] =1;
Queue<Pair> qt = new LinkedList<>();
qt.offer(new Pair(board, 0));
while (!qt.isEmpty()) {
Pair pi = qt.poll();
// System.out.println(cal(pi.status)+" "+pi.step);
if (cal(pi.status) == endStatus) return pi.step;
int x=0,y=0;
for(int i=0;i<pi.status.length;i++) {
for (int j = 0; j < pi.status[i].length; j++) {
// System.out.print(pi.status[i][j]+" ");
if (pi.status[i][j] == 0) {
x = i;
y = j;
break;
}
}
// System.out.println();
}
for(int i=0;i<4;i++)
{
int tx = x+dx[i];
int ty = y+dy[i];
if(tx<0 || ty<0 || tx>=2 || ty>=3) continue;
swap(pi.status,x,y,tx,ty);
int tmp =cal(pi.status);
if(vis[tmp]==1) { swap(pi.status,x,y,tx,ty); continue;}
vis[tmp] =1;
//System.out.println(x+" "+y+" "+tx+" "+ty+" "+tmp);
int[][] t=new int[2][3];
for (int ii=0;ii<2;ii++) {
for (int j=0;j<3;j++) {
//System.out.print(pi.status[ii][j]+" ");
t[ii][j] = pi.status[ii][j];
}
//System.out.println();
}
qt.offer(new Pair(t,pi.step+1));
swap(pi.status,x,y,tx,ty);
}
}
return -1;
}
}
class Pair{
public int[][] status;
public int step;
public Pair(int[][] status, int step) {
this.status = status;
this.step = step;
}
}