問題描述
給定乙個 n*m 的矩形色板,有 k 種不同的顏料,有些格仔已經填上了某種顏色,現在
需要將其他格仔也填上顏色,使得從左上角到右下角的任意路徑經過的格仔都不會出現兩種
及以上相同的顏色。路徑只能沿著相鄰的格仔,且只能向下或者向右。
計算所有可能的方案,結果對 1000000007 (10^9 + 7)求模。
輸入資料
第一行,三個整數 n, m, k (1 ≤ n, m ≤ 1000, 1 ≤ k ≤ 10);
接下來 n 行,每行包含 m 個整數,表示顏色。其中 0 表示未塗色,非 0 表示顏色的編號,
顏色編號為 1 到 k。
輸出資料
一行,乙個整數,表示塗色方案對 1000000007 (10^9 + 7)求模的結果。
輸入樣例 1
2 2 4
0 00 0
輸出樣例 1
48輸入樣例 2
2 2 4
1 22 1
輸出樣例 2
0輸入樣例 3
5 6 10
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
輸出樣例 3
3628800
輸入樣例 4
2 6 10
1 2 3 4 5 6
0 0 0 0 0 0
輸出樣例 4
4096
附上**
#include
#include
#include
#include
#include
#define mod 1000000007 //最後取摸
using
namespace
std;
int m,n,k;
intmap[12][12],f[11][12];
int color[15];
int log2[1
<<12];
int dfs (int x,int y)
if(x>n)
int fir=-1,temp,zt,ret=0;
zt=f[x][y-1]|f[x-1][y];//zt是x,y前所有用過的顏色
for (int i=(~zt)&((1
<1);i;i-=(i&(-i)))
ret+=fir;//由於第一次已經使用只用過一次的顏色,那麼由組合數學可知其他情況相同 e.g. 3 4 兩種顏色都沒有被用過,而在這個點兩種顏色用的情況是一樣的,那麼可以進行剪枝
}else
ret%=mod;
color[temp]--;//深搜慣例回歸情況}}
return ret;
}int main()
memset(color,false,sizeof(color));
for (int i=1;i<=n;i++)
}int temp=1;
for (int i=1;i<=k;i++)
cout
<1,1);
return
0;}
獨特的骰子
天真的wells認為自己的骰子是獨一無二的。當有人告訴他的骰子很可能在商店裡有很多個時,wells簡直不敢相信自己的小耳朵!那麼問題來了,眼花的wells會告訴你他的獨特的骰子的6個面,然後再告訴你一堆商店裡骰子。問和wells的獨特骰子長得一模一樣的到底有多少個。當然骰子是可以任意旋轉的。第一行乙...
php獨特的語法
今天寫乙個程式的時候遇到乙個很有意思的問題,這個和php獨特的語法有關,首先我們看一下 是怎麼寫的。db mysql connect localhost root ctrip07185419 or die can not connect to databas mysql select db movi...
MapReduce 獨特的思維
很高興來到這個有意思的地方 部落格論壇,當然這也是我的第一篇部落格。根據網上關於mapreduce的一些翻譯及他人的解釋,我對於mapreduce有了一些個人的認識和見解,想在這裡與大家分享和交流一下。mapreduce簡單來說,就是在超大計算機集群組上進行的簡單資料處理模式。首先,mapreduc...