QOJ.ac

QOJ

時間限制: 3 s 記憶體限制: 512 MB 總分: 100 可 Hack ✓

#22828. Aqua

统计

Aqua 是一種邏輯謎題遊戲,在劃分為 $r$ 列 $c$ 行的矩形棋盤上進行。列由下往上編號為 $1$ 至 $r$,行由左往右編號為 $1$ 至 $c$。第 $i$ 列第 $j$ 行的格子記為 $(i,j)$。

棋盤用鉛直與水平邊界劃分為若干個正交連通的區域。更準確地說,每個區域是棋盤格子的非空子集,棋盤上的每個格子恰好屬於一個區域。每個區域的格子集合形成一個連通分量:若兩個格子屬於同一區域,總能僅經過該區域的格子從一個移動到另一個,且每一步都在共邊相鄰的格子之間移動。

problem_22828_cacd86d1830994c84de7c3ab2ee1c931.png

圖 A.1:有 6 列、7 行和 8 個區域的棋盤。

在每個區域中,謎題設計者從區域的頂邊注水。由於重力,水會落入高度較低的格子。他注水時要滿足以下所有條件:

  • 每個格子要麼完全充滿水,要麼完全為空。

  • 一個區域可以充滿水、完全為空或部分充水。

  • 每個區域都存在某個水位 $\ell$,使該區域中低於此水位的所有格子都充滿水,高於此水位的所有格子都為空。換言之,設 $(r_1,c_1)$ 和 $(r_2,c_2)$ 是同一區域的兩個格子且 $r_1 \le r_2$,那麼如果格子 $(r_2,c_2)$ 充滿水,格子 $(r_1,c_1)$ 也必須充滿水。

  • 各個區域獨立且分開處理。因此,上述規則不適用於屬於不同區域的格子。

下面是一個合法棋盤的例子:

problem_22828_5f720c9c7f57466c69726353a8bd7d70.png

圖 A.2:一個合法的棋盤。

下面是一些不合法棋盤的例子:

problem_22828_4f402c835cbcd9482462c8867aac91fe.png

圖 A.3:不合法的棋盤——格子 $(5,5)$ 和 $(5,7)$ 應當同時充滿水或同時為空,因為它們在同一區域的同一列。

problem_22828_f029f0f5dfa1e3112e2fc7034574f2ca.png

圖 A.4:不合法的棋盤——格子 $(4,2)$、$(4,3)$、$(4,4)$ 為空,但它們與充滿水的格子 $(5,2)$ 屬於同一區域。

problem_22828_14512c5331df2bc2a7b70cf769d314fb.png

圖 A.5:不合法的棋盤——格子不能僅部分充水。

謎題設計者不僅遵循上述規則,還關注每一列充滿水的格子數。在某些列中,他希望充水格子數等於指定值,而不對其他列施加任何限制。

你的任務是統計滿足上述所有規則與要求的區域注水方案數。當且僅當存在一個格子在一種方案中充滿水、在另一種方案中為空時,兩種方案被視為不同。

輸入格式

輸入第一行包含兩個整數 $r,c$($1 \le r,c \le 20$)。接下來的 $r+1$ 行按以下規則描述棋盤:

  • 每行恰好包含 $2\cdot c+1$ 個字元,每個字元是空格、底線(_)或豎線(|)之一。

  • 第一行和最後一行的所有偶數索引位置上的字元都是底線,表示棋盤的上、下邊界。

  • 除上述底線外,輸入中的每個底線都表示同一行(直行)中兩個連續格子之間的水平區域邊界。

  • 除第一行外,每行的第一個和最後一個字元都是豎線,表示棋盤的左、右邊界。

  • 除上述豎線外,輸入中的每條豎線都表示同一列(橫列)中兩個連續格子之間的鉛直區域邊界。

請參見範例以更好地理解。

根據定義:

  • 如果同一行(直行)中兩個連續格子之間沒有水平區域邊界,則這兩個格子屬於同一區域。

  • 如果同一列(橫列)中兩個連續格子之間沒有鉛直區域邊界,則這兩個格子屬於同一區域。

最後一行包含 $r$ 個整數 $x_1,x_2,\ldots,x_r$($-1 \le x_i \le c$),描述各列充水格子數的要求。若 $x_i=-1$,則第 $r-i+1$ 列可以有任意數量的充水格子;否則該列的充水格子數必須恰好為 $x_i$。

保證棋盤最多有 20 個區域。

輸出格式

輸出恰好一個整數:滿足給定條件的合法棋盤數量,對 $10^9+7$ 取模。

範例

輸入格式 1

6 7
 _ _ _ _ _ _ _ 
| |  _ _|  _  |
| | |_ _| |_| |
| |_ _ _|  _ _|
| |  _ _| |   |
| | |_ _| |   |
|_|_ _ _|_|_ _|
6 3 7 2 2 2

輸出格式 1

1

說明

第一個範例對應上面的圖 A.2。

輸入格式 2

2 3
 _ _ _ 
|     |
|_ _ _|
-1 -1

輸出格式 2

3

輸入格式 3

3 3
 _ _ _ 
|  _  |
| | | |
|_|_|_|
-1 1 1

輸出格式 3

1

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.