A1825 | 万圣节后的早晨
来源NOI
时间限制1s
内存限制128MB
通过 / 提交0/0
题目描述
要求你写一个程序,在一个地图中,找到最小步数将每个鬼移动到他们指定的位置。地图包含一些小方格。每格要么是墙(鬼不能进入),要么是走廊(鬼能进入)。
每一步里,你可以同时移动任意数量的鬼。每个鬼要么待在原地不动,要么移动到相邻的格子里(相邻的格子有公共边),如果移动满足下列条件,则移动是可行的。
1. 没有一个以上的鬼在同一个格子里;
2. 没有一对鬼在一步里交换了位置。
例如,假设鬼的位置是如右上图所示的,其中sharp(#)表示墙,空格表示走廊,a,b,c表示鬼:
```plain
####
ab#
#c##
####
```
经过一步移动后,地图可以变成如下的样子:
```plain
#### #### #### ####
ab# a b# acb# ab #
#c## #c## # ## #c##
#### #### #### ####
```
每一步里,你可以同时移动任意数量的鬼。每个鬼要么待在原地不动,要么移动到相邻的格子里(相邻的格子有公共边),如果移动满足下列条件,则移动是可行的。
1. 没有一个以上的鬼在同一个格子里;
2. 没有一对鬼在一步里交换了位置。
例如,假设鬼的位置是如右上图所示的,其中sharp(#)表示墙,空格表示走廊,a,b,c表示鬼:
```plain
####
ab#
#c##
####
```
经过一步移动后,地图可以变成如下的样子:
```plain
#### #### #### ####
ab# a b# acb# ab #
#c## #c## # ## #c##
#### #### #### ####
```
输入格式
输入包括最多 $10$ 组数据,每组数据包含一幅地图。输入格式如下:
$$\begin{matrix} w & h & n \\ c_{1,1} & c_{1,2} & \cdots & c_{1,w} \\ c_{2,1} & c_{2,2} & \cdots & c_{2,w} \\ \vdots & \vdots & \ddots & \vdots \\ c_{h,1} & c_{h,2} & \cdots & c_{h,w} \\ \end{matrix}$$
第一行的 $w,h$ 和 $n$ 表示地图的宽度和高度,$n$ 表示鬼的数目,他们满足 $4 \le w \le 16$,$4 \le h \le 16$,$1 \le n \le 3$。
接下来 $h$ 行,每行 $w$ 个字符:
- 一个
- 一个小写字母表示鬼的初始位置(该位置也是走廊)。
- 一个大写字母表示鬼的目标位置(该位置也是走廊)。
- 一个空格表示空的走廊。
在每幅地图里,前 $n$ 个小写字母和前 $n$ 个大写字母表示鬼的初始位置及鬼的目标位置。我们需要将小写字母表示的鬼移动到对应的大写字母的位置里。
最后一组数据后一行有三个 $0$。
$$\begin{matrix} w & h & n \\ c_{1,1} & c_{1,2} & \cdots & c_{1,w} \\ c_{2,1} & c_{2,2} & \cdots & c_{2,w} \\ \vdots & \vdots & \ddots & \vdots \\ c_{h,1} & c_{h,2} & \cdots & c_{h,w} \\ \end{matrix}$$
第一行的 $w,h$ 和 $n$ 表示地图的宽度和高度,$n$ 表示鬼的数目,他们满足 $4 \le w \le 16$,$4 \le h \le 16$,$1 \le n \le 3$。
接下来 $h$ 行,每行 $w$ 个字符:
- 一个
# 表示墙。- 一个小写字母表示鬼的初始位置(该位置也是走廊)。
- 一个大写字母表示鬼的目标位置(该位置也是走廊)。
- 一个空格表示空的走廊。
在每幅地图里,前 $n$ 个小写字母和前 $n$ 个大写字母表示鬼的初始位置及鬼的目标位置。我们需要将小写字母表示的鬼移动到对应的大写字母的位置里。
最后一组数据后一行有三个 $0$。
输出格式
对每组数据输出一行一个整数,表示最小的移动步数。
输入输出样例
输入 #1
5 5 2 ##### #A#B# # # #b#a# ##### 16 4 3 ################ ## ########## ## # ABCcba # ################ 16 16 3 ################ ### ## # ## ## # ## # c# # ## ########b# # ## # # # # # # ## # # ## ## a# # # # # ### ## #### ## # ## # # # # # ##### # ## ## #### #B# # # ## C# # ### # # # ####### # # ###### A## # # # # ################
输出 #1
7 36 77
对每组数据输出一行一个整数,表示最小的移动步数。
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?
提交通过
评测结果:Accepted