- 获取所有钥匙的最短路径 - 力扣(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];
memset(vis, 0, sizeof(vis));
int startX, startY, allKeys = 0;
queue<node> q;
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));
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') {
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;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现