LCP 31. 变换的迷宫

本文介绍了如何运用记忆化搜索解决一个典型的多维深度优先搜索(DFS)或广度优先搜索(BFS)问题,具体是一个在变换的迷宫中寻找路径的问题。关键在于优化状态表示和利用永久卷轴的特性来降低时间复杂度,通过可行性剪枝减少无效计算,并给出了记忆化搜索的实现代码。文章还提到了递推解法但未给出具体实现。
摘要由CSDN通过智能技术生成

题目链接

LCP 31. 变换的迷宫
在这里插入图片描述
在这里插入图片描述

题目分析:

  • 典型的多维BFS/DFS搜索题,考虑状态表示为[x][y][t][f1][f2],表示坐标(x,y)的点在t时刻,两种卷轴的使用情况为f1,f2(为1表示未使用)能否到达终点,这里注意点下一时刻可能是停在原地的,所以枚举方向为5个,临时卷轴比较好处理,直接有f[x][y][t][1][f2]--->f[nx][ny][t+1][0][f2],但是选了永久卷轴后我们要记录选的这个点的坐标(x,y),不妨这样考虑,假设最后我们我们在某个点使用了永久,所以一开始直接暴力枚举最后那个点被选为永久,这样的复杂度为:n*m*T*n*m*2*2,所以会TLE;

  • 突破点1:
    永久卷轴只有在我们使用后在回到永久卷轴的使用地方它才不一样,不然就跟临时卷轴一样,即A-B-C-D-A与A-A-A-A-A等效,所以考虑每个点被选为永久卷轴的时候,直接考虑他在原地呆了多久,最长时间为T,复杂度为T*N*M*T*2*2,最坏1e8,最后竟然过了,下面是记忆化搜索的写法
    ,注意可行性剪枝;
    假设达到终点的时刻为t2,当前的时刻为t1,满足:
    t 2 − t 1 + 1 ≥ △ x , △ x 为 曼 哈 顿 距 离 {\color{Red} t2-t1+1\ge \bigtriangleup x,\bigtriangleup x为曼哈顿距离 } t2t1+1x,x
    t 2 ≥ m a x n , 不 合 法 的 情 况 发 现 为 m a x n − t 1 + 1 < △ x {\color{Red} t2\ge maxn,不合法的情况发现为maxn-t1+1<\bigtriangleup x} t2maxn,maxnt1+1<x

  • 记忆化写法

class Solution {
public:
    int dx[5]={0,1,0,-1,0};
    int dy[5]={1,0,-1,0,0};
    int n,m;
    int maxn;
    bool st[60][60][110][2][2]={false};
    bool dfs(int x,int y,int t,int f1,int f2,const vector<vector<string>>& maze){
        if(x==n-1&&y==m-1) return true;
        //可行性剪枝
        if(t>=maxn) return false;
        if(maxn-t+1<n-1-x+m-1-y) return false;
        if(st[x][y][t][f1][f2]==true) return false;
        st[x][y][t][f1][f2]=true;
        //考虑转移
        for(int i=0;i<5;i++){
         int nx=x+dx[i],ny=y+dy[i];
         if(nx<0||nx>=n||ny<0||ny>=m) continue;
         if(maze[t+1][nx][ny]=='.'){
             if(dfs(nx,ny,t+1,f1,f2,maze)) return true;
         }
         else{
             //使用临时转移
             if(f1==1){
                 if(dfs(nx,ny,t+1,0,f2,maze)) return true;
             }
             if(f2==1){
                 for(int j=t+1;j<=maxn;j++){
                    if(dfs(nx,ny,j,f1,0,maze)) return true;
                 }
             }
         }
        }
        return false;
    }
    bool escapeMaze(vector<vector<string>>& maze) {
    n=maze[0].size(),m=maze[0][0].size();
    maxn=maze.size()-1;
    if(dfs(0,0,0,1,1,maze)) return true;
    else return false;
    }
};
  • 递推写法(待补)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值