演算法提高 多公尺諾骨牌放置(加強版1)

2021-10-18 03:18:41 字數 1714 閱讀 9169

問題描述

有乙個m 行n 列的矩形方格棋盤,用12 的骨牌(可橫放或豎放)完全覆蓋,骨牌不能重疊。但是,棋盤中有一些p個位置有破洞,座標分別為(xi(第xi列),yi(第yi行)),這些位置不能放置骨牌了。請問有多少種不同的覆蓋的方法。

請對覆蓋方法總數 mod 10007 的值即可。

輸入格式

第 1 行,三個整數數n,m,p,

第 2 — p-1 行,兩個整數 xi,yi 。

輸出格式

乙個整數,總數 mod 10007 的結果。

樣例輸入

2 3 2

1 32 3

樣例輸出

2思路:

從題目我們可以知道有乙個m 行n 列的矩形方格棋盤,我們要用12 的骨牌(可橫放或豎放)完全覆蓋,但是不可以覆蓋有洞的地方。

所以可以用遞迴的形式,讓函式不斷的嘗試覆蓋棋盤,我們骨牌的方式是橫著放或豎放,那我們就知道當我們在棋盤上的某一點時可以橫著放或豎放,我們一直放的不可以在放為止。

我們可以從棋盤的(1,1)開始放,一直到(m,n)就結束迴圈。

我們在當前為置放骨牌的條件就是當前位置不能有放過骨牌,滿足此條件我們才可以放,不滿足則返回上級。 (這個方法的複雜度太大。。)

程式:

import sys

sys.setrecursionlimit(

1000000

)n,m,p=

map(

int,

input()

.split())

mp=[[0

for i1 in

range

(m+1)]

for i in

range

(n+1)]

#我們的棋盤

for i in

range

(p):

x1,y1=

map(

int,

input()

.split())

mp[x1]

[y1]=1

#破損的地方

con=

0def

dfs(x,y)

:#xy 表示當前位置

global con

if x==n and y==m+1:

#當點訪問完所有位置時

con+=

1return

if y==m+1:

#下一行

dfs(x+1,

1)return

if mp[x]

[y]==0:

#當點沒有骨牌

for i in[[

0,1]

,[1,

0]]:

#試著橫著放或豎放

x1=x+i[0]

y1=y+i[1]

if00[y1]==0

:#判斷是否越界和放的位置有骨牌

mp[x]

[y]=

1#放骨牌

mp[x1]

[y1]=1

dfs(x,y+1)

mp[x]

[y]=

0#回溯

mp[x1]

[y1]=0

else

: dfs(x,y+1)

dfs(1,

1)print

(con)

多公尺諾骨牌

100張多公尺諾骨牌整齊地排成一列,按順序編號為1 2 3 4 99 100。第一次拿走所有的奇數字置上的骨牌,第二次再從剩餘的骨牌中拿走所有奇數字置上的骨牌,依次類推,請問最後剩下的一張骨牌的編號是多少 a.48 b.50 c.52 d.64 正確答案 d.答對了嗎?答對了嗎?答對了嗎?第一次拿走...

多公尺諾骨牌

現有n塊 多公尺諾骨牌 s1,s2,s3,sn水平放成一排,每次骨牌si包含左右兩個部分,每個部分賦予乙個非負整數值,如下圖所示為包含6塊骨牌的序列.骨牌可做180度旋轉,使得原來在左邊的值變到右邊,而原來右邊的值移到左邊,假設不論si如何旋轉,l i 總是儲存si左邊的值,r i 總是儲存si右邊...

多公尺諾骨牌

在課堂上,我們分析了棋盤覆蓋問題,同學們也看了我的程式執行的情況,今天我們來看一下另外乙個覆蓋問題。今天的問題是這樣的 用n個2x1的矩形 這種矩形我們以後稱之為骨牌或多公尺諾 覆蓋2xn的棋盤,有多少種不同的覆蓋法?input 本問題有多組測試資料,對於每一組測試資料,輸入只有一行n 意義如上所述...