鋪磚問題是組合數學中的一類經典問題,是利用遞推關係解決實際問題的一個典型案例。
基本介紹
- 中文名:組合數學--鋪磚
- 相關知識:遞推關係
鋪磚問題
編程求解
#include <stdio.h>#include <math.h>#include <stdlib.h>#include <string.h>long long f[13][2050];_Bool adj[2050][2050]; //所有可能的轉移int W,H;void dfs(int from,int step,int to){ if(step == W) { adj[from][to] = 1; return; } if(((1 << step) & from) != 0) //已經放過,考察下一個 dfs(from,step + 1,to); else { if((step <= W - 2) && ((1 << (step + 1)) & from) == 0) //兩塊都是空的,可以橫放 dfs(from,step + 2,to); dfs(from,step + 1,to | (1 << step)); //豎著放 }}int main(){ freopen("floor.in","r",stdin); freopen("floor.out","w",stdout); scanf("%d%d",&W,&H); if((W * H) % 2 == 1) //無解情況 { printf("0\n"); fclose(stdout); exit(0); } int max = 1 << W; int i,j,k; for(i = 0;i < max;i ++) //DFS構建矩陣 dfs(i,0,0); f[0][0] = 1; for(i = 0;i < H;i ++) for(j = 0;j < max;j ++) for(k = 0;k < max;k ++) if(adj[j][k]) f[i + 1][k] += f[i][j]; printf("%I64d\n",f[H][0]); fclose(stdout); return 0;}