LeetCode 773 题解

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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值