题目大意:有一些1*2的矩形,现在用这些小矩形覆盖M*N的大矩形,不能重复覆盖,并且要覆盖完全,求有多少种覆盖方式。
分析:可以使用1和0两种状态来表示这个位置有没有放置,1表示放置,0表示没有放置,可以有三种放置方式。
一,竖着放。 二,不放。三,横着放。直接DFS这些情况就行了................还是递归容易理解。
代码如下:
=========================================================================================================
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; const int MAXN = 12; const int Bit = 11; long long dp[MAXN][1<<Bit]; int M, N; void DFS(int row, int col, int now, int pre) { if(col == N) { dp[row][now] += dp[row-1][pre]; return ; } if(col+1 <= N) { DFS(row, col+1, now<<1|1, pre<<1);///这一位竖着放 DFS(row, col+1, now<<1, pre<<1|1);///这一位不放 } if(col+2 <= N) DFS(row, col+2, now<<2|3, pre<<2|3); } int main() { while(scanf("%d%d", &M, &N) != EOF && M+N) { memset(dp, 0, sizeof(dp)); if(N > M)swap(N, M); dp[0][(1<<N)-1] = 1; for(int i=1; i<=M; i++) DFS(i, 0, 0, 0); printf("%lld ", dp[M][(1<<N)-1]); } return 0; }