25. 进圈

题目

Description

龙龙最近迷上了一款名叫 PUBG(PLAYERUNKNOWN'S BATTLEGROUNDS)的手游,那是一款关乎生存挑战的 RPG 逃亡游戏。

考虑到游戏的环节过于复杂,龙龙决定简化一下场景:整个地图可以看做一个长为 ​ 宽为 ​ 的二维格点平面。龙龙需要从 逃亡到 以逃离毒圈,但有些格点上存在障碍#不能行走,有些格点是沙地.。龙龙只能移动在允许行走的沙地上,同时每一时刻,龙龙只能朝着当前位置周围的上、下、左、右四个方向移动。同时因为龙龙使用了能量饮料,每分钟最多可以朝着一个方向行走 步。

毒圈快要来啦,请你帮龙龙尽快安排一下可行的路线,使得它能够以最短的时间顺利进圈。

Input

第一行输入三个正整数 和 表示地图的大小还有龙龙每分钟最多可以移动的步数;

接下来 行,每行包含 个字符,其中第 行第 个字符表示坐标 的路况,它可能是#,这表示这个格点是障碍区,不能行走,也可能是.表示沙地;

最后一行输入四个正整数 由空格间隔开,表示龙龙的初始位置和目标位置。

Output

请输出一个正整数 ,表示龙龙从 到 进圈最少需要的时间(分钟),如果龙龙最终不能进圈,则请输出-1。

Hint

对于样例,龙龙第一分钟走 步,从 到 ,第二分钟从 到 ,第三分钟从 走到 顺利进圈。


C++完整代码

有查重,改改再提交乐学!!!

cpp 复制代码
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;


const int dir_x[4] = { 0, 0, 1, -1 };
const int dir_y[4] = { 1, -1, 0, 0 };

struct node {
    int x, y;
    int step;
    node(int _x, int _y, int _step) : x(_x), y(_y), step(_step) {}
};


queue<node> que;
int visited[1000][1000];
char map[1000][1000];

int main() {
    int n, m, k;
    int x1, y1, x2, y2;
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 0; i < n; ++i) {
        scanf("%s", &map[i]);
    }
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

        que.push(node(x1 - 1, y1 - 1, 0));
        int ans=-1;

        while (!que.empty()) {
            node tmp = que.front();
            que.pop();

            for (int i = 0; i < 4; ++i) {
                for (int j = 1; j < k + 1; j++) {
                    int x = tmp.x + dir_x[i] * j, y = tmp.y + dir_y[i] * j;
                    if (x < 0 || x >= n || y < 0 || y >= m || map[x][y] == '#')
                    {
                        break;
                    }
                    if (visited[x][y] == 1)
                        continue;
                    if (x == x2 - 1 && y == y2 - 1) {
                        ans = tmp.step + 1;
                        printf("%d\n", ans);
                        return 0;

                    }
                    que.push(node(x, y, tmp.step + 1));
                    visited[x][y] = 1;
                }
            }
        }

        printf("%d\n", ans);


    return 0;
    }
相关推荐
Cx330❀5 分钟前
《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用
java·开发语言·数据结构·c++·算法·面试
不染尘.37 分钟前
2025_11_5_刷题
开发语言·c++·vscode·算法·贪心算法·动态规划
2501_929177581 小时前
C++中的虚基类
开发语言·c++·算法
Blossom.1181 小时前
把AI“贴”进路灯柱:1KB决策树让老旧路灯自己报「灯头松动」
java·人工智能·python·深度学习·算法·决策树·机器学习
QT 小鲜肉1 小时前
【QT/C++】Qt网络编程进阶:TCP网络编程的基本原理和实际应用(超详细)
c语言·开发语言·网络·c++·qt·学习·tcp/ip
艾莉丝努力练剑2 小时前
【C++:map和set的使用】C++ map/multimap完全指南:从红黑树原理入门到高频算法实战
大数据·开发语言·c++·人工智能·stl·map
墨染点香3 小时前
LeetCode 刷题【144. 二叉树的前序遍历】
数据结构·算法·leetcode
cynicme8 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
ShineSpark9 小时前
Crashpad 在windows下编译和使用指南
c++·windows
Larry_Yanan11 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互