Leetcode1210-穿过迷宫的最少移动次数

24 篇文章 0 订阅

BFS

分两种的情况:

①蛇是横着的,则有三种状态的变换:向右走,向下走,顺时针旋转

②蛇是竖着的,亦有三种状态的变换:向下走,向右走,逆时针旋转

同时用哈希表来记录蛇走过的状态来去重,细节多实现略繁琐但思路不难。

class Solution {
public:
    int minimumMoves(vector<vector<int>>& grid) {
        int m=grid.size();
        vector<unordered_set<int>> g(m*m);
        queue<pair<int,int>> q;
        g[0].insert(1);
        q.push({0,1});
        int len=0;
        while(!q.empty()){
            int sz=q.size();
            while(sz--){
                auto [t,h]=q.front();
                q.pop();
                int tx=t/m,ty=t%m;
                int hx=h/m,hy=h%m;
                if(tx==m-1&&ty==m-2&&hx==m-1&&hy==m-1) return len;
                if(tx==hx){
                    if(hy+1<m&&!grid[hx][hy+1]){
                        if(!g[hx*m+hy].count(hx*m+hy+1)){
                            q.push({hx*m+hy,hx*m+hy+1});
                            g[hx*m+hy].insert(hx*m+hy+1);
                        }
                    }
                    if(hx+1<m&&!grid[hx+1][hy]&&!grid[tx+1][ty]){
                        if(!g[(tx+1)*m+ty].count((hx+1)*m+hy)){
                            q.push({(tx+1)*m+ty,(hx+1)*m+hy});
                            g[(tx+1)*m+ty].insert((hx+1)*m+hy);
                        }
                        if(!g[tx*m+ty].count((tx+1)*m+ty)){
                            q.push({tx*m+ty,(tx+1)*m+ty});
                            g[tx*m+ty].insert({tx*m+ty,(tx+1)*m+ty});
                        }
                    }
                }else if(ty==hy){
                    if(hx+1<m&&!grid[hx+1][hy]){
                        if(!g[hx*m+hy].count((hx+1)*m+hy)){
                            q.push({hx*m+hy,(hx+1)*m+hy});
                            g[hx*m+hy].insert({hx*m+hy,(hx+1)*m+hy});
                        }
                    }
                    if(hy+1<m&&!grid[hx][hy+1]&&!grid[tx][ty+1]){
                        if(!g[tx*m+ty+1].count(hx*m+hy+1)){
                            q.push({tx*m+ty+1,hx*m+hy+1});
                            g[tx*m+ty+1].insert({tx*m+ty+1,hx*m+hy+1});
                        }
                        if(!g[tx*m+ty].count(tx*m+ty+1)){
                            q.push({tx*m+ty,tx*m+ty+1});
                            g[tx*m+ty].insert({tx*m+ty,tx*m+ty+1});
                        }
                    }
                }
            }
            len++;
        }
        return -1;
    }
};

时间复杂度:O(n^n)。

空间复杂度:O(n^n)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值