首页 > 其他分享 >获取所有钥匙的最短路径

获取所有钥匙的最短路径

时间:2024-07-22 20:31:14浏览次数:10  
标签:ny int 代码 路径 获取 钥匙 && grid

  1. 获取所有钥匙的最短路径 - 力扣(LeetCode)
    听完左程云teacher的讲解感觉这道题很简单不就是记录一下我有几把钥匙走到这个点我有几把钥匙夺走几次和普通bfs一样只是我要多走几次,
    等到上手发现真的难,水平还是太差了, 开始我需要进行初始化每一个的初始化,不然我有问题,
    他的核心代码很好理解但是前置代码就相比核心代码更难去想
    思路:先将全图跑一遍将起点的找到起点我进行记录,然后我在记录我的总钥匙数量,
    就开始我的遍历了,每一行每一步走完的结果会是什么样子,
    例如题目两把钥匙就有四种可能 01 00 11 10 这四种可能所以vis开到三维分别记录我有哪吧钥匙我的x,y的坐标进行,
    进行遍历后可以将我走在路上接下来碰到的锁我能不能开以及我需不需要开,直到我拿到所有钥匙,进行输出上代码
点击查看代码
class Solution {  
public:  
struct node {  
    int x, y; // 位置  
    int keys; // 钥匙状态(位掩码)  
};  
    int shortestPathAllKeys(vector<string>& grid) {  
        int k = 6;  
        int n = grid.size(), m = grid[0].length();  
        int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};//遍历我的上下左右 
        bool vis[105][105][1 << k];  // 访问标记,记录是否访问过某个位置和钥匙状态 
   //1<<k什么意思? 相当于2的k次方 相当于我再二进制中一直左移直到k次比如6次就是100000(二进制)
        memset(vis, 0, sizeof(vis));  // 初始化起点和收集所有钥匙的位掩码  
  
        int startX, startY, allKeys = 0;//开始的位置和总钥匙数量  
        queue<node> q; // 使用自定义结构体 node 
  
        // 初始化起点和收集所有钥匙的位掩码  
        for (int i = 0; i < n; ++i) {  
            for (int j = 0; j < m; ++j) {  
                if (grid[i][j] == '@') {//找到开始的位置并记录 
                    startX = i;  
                    startY = j;  
                }  
                if (grid[i][j] >= 'a' && grid[i][j] <= 'f') {  
                    allKeys |= 1 << (grid[i][j] - 'a');//记录初始的钥匙数量
                }  
            }  
        }  
  
        q.push(State(startX, startY, 0)); // 初始位置,钥匙状态为0  
        vis[startX][startY][0] = 1;//开始位置进行记录  
  
        int steps = 0; //记录我最少走了几步
        while (!q.empty()) {  
            int size = q.size();  
            for (int i = 0; i < size; ++i) {  
                State curr = q.front();//将我的坐标进行输出 
                q.pop();  
  
                if (curr.keys == allKeys) return steps; // 所有钥匙都找到了  
  
                for (int j = 0; j < 4; ++j) {//遍历这个点的上下左右位置 
                    int nx = curr.x + dir[j][0];  
                    int ny = curr.y + dir[j][1];  
  
                    if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;//超出我棋盘范围就删
                    char c = grid[nx][ny];  
  
                    if (c == '#') continue; // 障碍物  
  
                    int nextKeys = curr.keys;  
                    if (c >= 'a' && c <= 'f') { //为什么这样子捡钥匙?这样子可以判断我捡的是哪吧
                //例如abcd四把钥匙捡到c这样子我记录的位置就是0100捡到钥匙的地方我记成1  
                        nextKeys |= 1 << (c - 'a'); // 捡起钥匙  
                    }  
  
                    if (c >= 'A' && c <= 'F' && !(curr.keys & (1 << (c - 'A')))) {  
                        continue; // 如果没有相应的钥匙,则不能通过  
                    }  
  
                    if (!vis[nx][ny][nextKeys]) {  
                        vis[nx][ny][nextKeys] = true;//现在到这个地方我走过了并且我有几个钥匙 
                        q.push(State(nx, ny, nextKeys));  
                    }  
                }  
            }  
            ++steps;/走过了这一步走下一步  
        }  
  
        return -1; // 没有找到所有钥匙  
    }  
};

标签:ny,int,代码,路径,获取,钥匙,&&,grid
From: https://www.cnblogs.com/gqc4722/p/18316822

相关文章

  • 获取钥匙
    这题目标是通过移动拿到所有钥匙,上锁的房间需要对应的钥匙,思路是通过|和&二进制判断是否有对应钥匙,与普通不同的是,不同点是当我重复进入一个房间时,不能单纯通过有无来过来判断是否continue,而是要通过进入这个房间时钥匙的状况来判断点击查看代码 structnode{ intx,y,......
  • (图文)vscode cph设置文件路径(全网首发,但是丐版)
    目录引言(全是废话,不要看,直接跳到正文)正文(直接看这就行)引言(全是废话,不要看,直接跳到正文)由于我经常使用洛谷刷题,并且我使用vsocde作为编辑器,那么必不可少的就是一个叫做vscode-luogu的插件,这个插件可以实现题目的搜索、查看和提交(不过貌似这个插件已经停更了),如果你还装了c......
  • 获取所有钥匙的最短路径
    classSolution{public:intshortestPathAllKeys(vector<string>&a){//上右下左structnode{intx,y,w;};constintN=34,K=6;intdirs[5]={-1,0,1,0,-1};boolvis[N]......
  • 使用 useNuxtData 进行高效的数据获取与管理
    title:使用useNuxtData进行高效的数据获取与管理date:2024/7/22updated:2024/7/22author:cmdragonexcerpt:深入讲解了Nuxt3中useNuxtData组合函数的应用,演示了如何通过此函数访问缓存数据,实现组件间数据共享,以及如何在数据更新时利用缓存提高用户体验。文章提供了......
  • eyoucms获取当前栏目分类的下级栏目的文档列表
    [基础用法]标签:modelsartlist(channelartlist)备注:使用channelartlist也可以正常输出描述:获取当前栏目分类的下级栏目的文档列表用法:{eyou:modelsartlisttypeid='栏目ID'type='son'loop='20'}<ahref='{eyou:fieldname='typeurl'/}'>{eyou:f......
  • 关于token获取遇到的问题
    问题描述最近在做一个项目的登录的时候,发现了登录不上的问题。这个系统是从主系统(例如:www.abc.com)中登录,然后跳转到子系统中(例如:www.abc.com/d/e),主系统可以正常登录,但是在跳转子系统的过程中会遇到token失效的问题,总是进不去。问题研究最后发现,主系统登录后,token存储在path为......
  • 代码随想录算法训练营第36天 | 动态规划基础2:62.不同路径、63.不同路径 II
    62.不同路径https://leetcode.cn/problems/unique-paths/submissions/548656029/代码随想录https://programmercarl.com/0062.不同路径.html63.不同路径IIhttps://leetcode.cn/problems/unique-paths-ii/description/代码随想录https://programmercarl.com/0063.不同路径......
  • Vue3 - 详解实现网站使用企业微信二维码扫描登录,企业微信授权第三方网站接入企业微信
    前言如果您需要Vue2版本,请访问这篇文章。在vue3|nuxt3网站开发中,详解实现网页集成使用“企业微信扫一扫登录”功能,用户使用手机企业微信app扫描网站的登录二维码后,获取用户身份信息及号码并完成授权登录教程,新手小白完整流程及示例运行代码,支持多种企业微信二......
  • 欧拉图、欧拉路径、欧拉回路
    P7771【模板】欧拉路径欧拉路径的模板题。思路首先判断是否有欧拉路径,然后排序,找出起点,最后dfs找路径。代码细节多,比如要判断一个点是否存在(这个题目不需要)。#include<bits/stdc++.h>usingnamespacestd;constintN=100010;vector<int>e[N];inthead[N],in......
  • Flask 无法获取中文参数
    我已经在docker中从nvidia/cuda:12.5.1-cudnn-runtime-ubuntu22.04构建了一个Flask应用程序。但是这个flask无法接收任何utf-8请求,并出现Badrequestsyntax错误。#herethemessycodeä½\xa0好is你好inChinese,whichmeanshello......