P1228 地毯填補問題(遞迴)

2021-10-07 23:52:32 字數 1912 閱讀 9338

題意:給你一張大小為2k * 2k 的地圖,你要用4種地毯去填充這張地圖,規定有乙個點不能填,每個格仔只能被一張地毯覆蓋,讓你輸出覆蓋方案。(方案為第i種地毯在點(x,y)處拐角)

地毯樣式:

如果在乙個2 * 2的地圖裡,我們顯然直接用一種給它補全就行。

如果在乙個4 * 4的地圖裡,我們完成以下操作後,需要補全其他部分。

假如我們把2 * 2看做乙個整體,每個小整體分別還能放下乙個地毯,但是每個小整體都會多出乙個小塊來,我們就讓這三個小塊形成一塊地毯,這樣就行了。

然後由小到大,這個問題就解決了。

**:

#include

#pragma gcc optimize("ofast")

#define endl '\n'

#define null null

#define ls p<<1

#define rs p<<1|1

#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define ll long long

//#define int long long

#define pii pair

#define ull unsigned long long

#define all(x) x.begin(),x.end()

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define ct cerr<

char

*fs,

*ft,buf[

1<<20]

;#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}using

namespace std;

const

int n=

1e5+5;

const

int inf=

0x3f3f3f3f

;const

int mod=

9901

;const

double eps=

1e-7

;const

double pi=

acos(-

1);void

dfs(

int k,

int x,

int y,

int mx,

int my)

int d=

pow(

2,k-1)

;if(x<=mx+d-

1&& y<=my+d-1)

else

if(x<=mx+d-

1&& y>my+d-1)

else

if(x>mx+d-

1&& y<=my+d-1)

else

if(x>mx+d-

1&& y>my+d-1)

}signed

main()

P1228 地毯填補問題(遞迴 分治)

p1228 地毯填補問題 其實這道題目一點也不會寫,光看懂別人的解題思路就花了好長時間。那現在我來說說我對這個題目的理解。1.所謂拐點就是每種毯子,中間的那塊,也就是那個點的座標。2.可以發現當格仔22時,必有一種填充方式。3.由2引申,我們可以把迷宮全部分成22,也就是遞迴結束的標誌。includ...

P3397 地毯 差分

題目背景 此題約為noip提高組day2t1難度。題目描述 在 n nn times nn n 的格仔上有 mmm 個地毯。給出這些地毯的資訊,問每個點被多少個地毯覆蓋。輸入格式 第一行,兩個正整數 n,mn,mn,m。意義如題所述。接下來 mmm 行,每行兩個座標 x1,y1 x 1,y 1 x1...

洛谷 P3397 地毯

此題約為noip提高組day2t1難度。在n n的格仔上有m個地毯。給出這些地毯的資訊,問每個點被多少個地毯覆蓋。輸入格式 第一行,兩個正整數n m。意義如題所述。接下來m行,每行兩個座標 x1,y1 和 x2,y2 代表一塊地毯,左上角是 x1,y1 右下角是 x2,y2 輸出格式 輸出n行,每行...