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