Noip模擬題 山峰

2021-08-09 15:56:30 字數 1824 閱讀 4634

description在n

∗m的棋盤上不重複的填1到n∗

m ,如果乙個數字比周圍的八個數字大,那麼他就是乙個山峰。現在告訴你所有山峰的位置,問你填數的方案數mod 12345678

input

輸入第一行兩個數字

n ,

m意義如題目描述。

接下來n

行,每行

m個字元,』.』表示非山峰,』x』表示山峰。 1≤

n≤4 ,m≤

7 output

僅一行,包含乙個數字,為取模後的方案數。

sample input

1 3

.x.sample output

2hint

並不是我寫的題解

思路

這道題限制條件比較嚴格,山峰只能是給定的位置,其他的位置都不能是山峰。。。如果沒有這個限制,那麼直接狀態壓縮dp就可以了:從大到小列舉數字,設fs

,i表示已經填了

i 個數字,填過的山峰為

s的二進位制狀態,顯然每個靠近山峰的數都可以填,其他的都不能填;也可以填乙個沒有填過的山峰。但是,有這個限制,那麼就要用到容斥原理,多的減去,少的加上就可以了。

**

#include 

#include

const

int maxn=4;

const

int maxm=7;

const

int maxtot=8;

const

int dx= ;

const

int dy= ;

const

int mo=12345678;

int n,m,ans;

char

map[maxn+1][maxm+1];

int x[maxn*maxn+1],y[maxn*maxn+1],can[maxn+1][maxm+1];

int f[1

<1];

int in_range(int x,int y)//這個點是否在圖的範圍內

int x_around(int x,int y)//這個點周圍是否有山峰}}

return0;}

int calc()//計算至少有給定的點是山峰時的方案數}}

f[0][0]=1;

for(int s=0; s<1

for(int i=1; i<=tot; i++)}}

}int cnt=0;

for(int i=1; i<=n; i++)}}

for(int i=0; i<=cnt; i++)}}

}}

return f[(1

<1][n*m];

}int search(int x,int y,int k)

//尋找到了(x,y)這個點,找到答案後如果k=1那麼就將答案加上這個值,否則減去這個值

if(y>m)

search(x,y+1,k);

if((!x_around(x,y))&&(map[x][y]=='.'))

return0;}

int main()

for(int i=1; i<=n; i++)}}

search(1,1,1);

printf("%d\n",(ans+mo)%mo);

return

0;}

NOIP模擬題 連通

給定乙個無向圖,請編寫乙個程式實現以下兩種操作 1 d x y,從原圖中刪除連線x和y頂點的邊。2 q x y,詢問x和y頂點是否連通。這也是連通問題,考慮用並查集解決。但是這是刪除的問題耶,怎麼辦?考慮將刪除變為連通,能不能將所有操作給反過來,從最後乙個操作開始處理。當然是可以的。include ...

NOIP模擬題 訂餐

題目描述 這個週末,joe 一如既往的拿出了外賣的點餐單。選單上從上到下列著 n 個菜,每個菜 joe 會列出乙個美味值。joe 這次希望從選單上連續地點 k 個菜,並且美 味值之和最大。但在計算美味值之和時,joe 有自己的一套計算方法 由於他會按照順序享受這 k 個菜,並且越吃越後面的菜他就越享...

NOIP模擬題 柵欄

題目大意 給定乙個 n times m 的網格圖,每次會選擇一塊矩形沿著網格線鋪上柵欄,或者拆除之前鋪的柵欄,或者詢問兩個格仔能否不經過柵欄直接到達。保證柵欄沒有重疊或交叉,刪去的柵欄刪除前一定存在。題解考慮兩個格仔能互相到達,當且僅當包含它們的柵欄完全相同。考慮對每乙個柵欄隨機乙個權值,維護覆蓋每...