QOJ.ac

QOJ

Limite de temps : 10 s Limite de mémoire : 1024 MB Points totaux : 40

#5883. 镜厅

Statistiques

你生活在一个二维平面上,你最喜欢去的地方之一是镜子大厅。镜子大厅是一个网格状的房间(当然是二维的)。网格中的每个方格要么包含一面方形镜子,要么是空地,要么是你自己。你的宽度和高度均为 0,且你位于所在网格方格的中心。

尽管你非常小,但当光线精确地反射回你时,你就能看到自己的倒影。例如,考虑以下布局,其中 '#' 表示完全填满该方格的方形镜子,'.' 表示空地,大写字母 'X' 表示你位于该方格的中心:

######
#..X.#
#.#..#
#...##
######

如果你直视上方或右方,你将能够看到自己的倒影。

不幸的是,镜子大厅里雾气很大,所以你无法看到超过 $D$ 个单位距离以外的东西。假设 $D=3$。如果你向上看,你的倒影将在 1 个单位距离处(0.5 到镜子,0.5 返回)。如果你向右看,你的倒影将在 3 个单位距离处(1.5 到镜子,1.5 返回),你将能够看到它。如果你向下看,你的倒影将在 5 个单位距离处,你将无法看到它。

理解光在镜子大厅中如何传播非常重要。光沿直线传播,直到碰到镜子。如果光碰到镜子的任何部分(角除外),它将以正常方式反射:它将以等于入射角的反射角弹回。另一方面,如果光接触到镜子的角,情况就比较复杂了。以下图示解释了各种情况:

在以下情况中,光接近一个角并被反射,改变了它的方向:

在前两种情况下,光在两面相邻镜子的交点处接近它们。光的反射方式与它击中长镜子中间时的反射方式相同。在第三种情况下,光接近三面相邻镜子的角,并沿原路返回。

在以下情况中,光接近一面或多面镜子的角,但没有反弹,而是继续沿相同方向传播:

这种情况发生在光到达距离镜子角 0 的位置,但不需要穿过镜子就能继续沿相同方向传播时。通过这种方式,一束光可以穿过两面斜向相邻的镜子之间——实际上是穿过一个大小为 0 的空间。好在它的大小也是 0,所以它能穿过去!

在最后一种情况下,光接近一面镜子的角并被销毁:

镜子挡在了光的路径上,且光束没有接近任何其他镜子的角。

注意,光在碰到你时会停止,但它必须击中你所在网格方格的精确中心。

你能看到多少个自己的倒影?

输入格式

输入的第一行包含测试用例的数量 $T$。接下来是 $T$ 个测试用例。每个测试用例的第一行包含三个空格分隔的整数 $H$、$W$ 和 $D$。接下来的 $H$ 行,每行包含 $W$ 个字符。这些字符构成了如上所述的镜子大厅地图。

输出格式

对于每个测试用例,输出一行 "Case #x: y",其中 $x$ 是用例编号(从 1 开始),$y$ 是你能看到的自己的倒影数量。

数据范围

内存限制:1GB。 时间限制:10 秒。 $1 \le T \le 100$。 $3 \le H, W \le 30$。 $1 \le D \le 50$。 地图中的所有字符均为 '#''.''X'。 每个地图中恰好有一个字符为 'X'。 每个地图的第一行、最后一行、第一列和最后一列完全由 '#' 字符填充。

子任务 1

'#' 字符的数量不超过 $2W+2H-4$。

子任务 2

没有额外的限制。

样例

样例输入 1

6
3 3 1
###
#X#
###
3 3 2
###
#X#
###
4 3 8
###
#X#
#.#
###
7 7 4
#######
#.....#
#.....#
#..X..#
#....##
#.....#
#######
5 6 3
######
#..X.#
#.#..#
#...##
######
5 6 10
######
#..X.#
#.#..#
#...##
######

样例输出 1

Case #1: 4
Case #2: 8
Case #3: 68
Case #4: 0
Case #5: 2
Case #6: 28

说明

在第一个用例中,如果你直视上、下、左或右,光传播的距离正好为 1。

在第二个用例中,如果你向右上、左上、右下或左下看,光传播的距离为 1.414...。由于光不会穿过你,直视上方只能看到一个自己的倒影。

在第五个用例中,虽然附近的镜子足够近,可以将光反射回你,但击中镜子角的光被销毁了,而不是被反射。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.