2367. 海上营救

1000ms 256MB 简单 广度优先搜索 BFS
题目描述
海上巡逻队收到了求救信号,经确认信号由“大山号”发出。时间就是生命,巡逻队必须尽快赶到那里。 通过导航卫星的侦测,巡逻队获得了一张海洋图。地图上这块区域被划分成 $n \times n$ 个方格区域,其中: - `*` 表示岛屿(不可通行)。 - `.` 表示海洋(可通行)。 巡逻队当前处于起点位置 $(1, 1)$。船只航行中只能从一个区域移动到相邻的 8 个区域(即上、下、左、右以及 4 个对角线方向)。 请计算巡逻队航行到大山号所在位置的最短距离(每移动到一个相邻区域距离增加 1)。如果无法到达,输出 `-1`。
输入格式
- 第一行包含一个正整数 $n$ ($1 \le n \le 50$),表示海洋图的大小。 - 接下来 $n$ 行,每行包含一个长度为 $n$ 的字符串,表示海洋图的每一行(仅由 `.` 和 `*` 组成)。 - 最后一行包含两个正整数 $x$ 和 $y$ ($1 \le x, y \le n$),表示大山号所在的行坐标和列坐标(1-indexed)。
输出格式
- 输出一个整数,表示巡逻队到大山号的最短距离;若无法到达,输出 `-1`。
样例 1
输入 (Input)
4
....
.**.
..*.
*...
4 4
输出 (Output)
4
- 对于 $100\%$ 的数据:$1 \le n \le 50$,大山号坐标满足 $1 \le x, y \le n$。 - 起点 $(1, 1)$ 和终点 $(x, y)$ 保证在地图范围内。 - **算法提示**: 本题为标准的**八连通网格图最短路**问题,使用**广度优先搜索(BFS)**求解: 1. 将输入的 1-indexed 终点坐标 $(x, y)$ 转换为 0-indexed 的数组下标 $(x-1, y-1)$。 2. 队列中除了记录当前位置 $(r, c)$ 外,还需要记录从起点出发到达当前位置的步数 `dist`。 3. 每次出队一个位置,向其**八个方向**扩展(上、下、左、右、左上、右上、左下、右下)。 4. 若相邻位置在网格范围内、不是岛屿 `*` 且未被访问过,则将其标记为已访问并入队,步数加 1。 5. 首次到达目标点时即可直接返回当前步数;若队列为空仍未到达,说明无法到达,输出 `-1`。
自测终端 stdin → stdout
输入 stdin
CtrlShiftEnter
输出 stdout

                
错误 stderr

                
CtrlEnter提交
自动保存已开启
操作成功
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字