题目大意:用 2*1 或者2*2-1的格子覆盖M*N的矩阵,有多少种覆盖方式。
分析:容易知道有以下6种放置方式。
然后用深搜的方法直接搞出来就行了,不过要使用两个变量来判断本位是否受影响。如果本行的放置可以影响上一行,比如(1,3,4,5,6)那么所影响的位置为0,如果没有受到影响那么就是1。
代码如下:
=====================================================================================================================
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; const int MAXN = 12; const int Bit = 9; long long dp[MAXN][1<<Bit]; int M, N; void DFS(int row, int col, int now, int pre, bool uNow, bool uPre) {///row表示所在行,col表示列,now表示本行的状态,pre表示上一行的状态 ///uNow uPre表示本列和上一列是否收到影响,1表示受影响,0表示没有 if(col == N) { if(!uNow && !uPre) dp[row][now] += dp[row-1][pre]; return ; } if(!uNow) { if(!uPre) { DFS(row, col+1, now<<1|1, pre<<1, 0, 0); DFS(row, col+1, now<<1|1, pre<<1, 1, 0); DFS(row, col+1, now<<1|1, pre<<1, 0, 1); } DFS(row, col+1, now<<1|1, pre<<1|(!uPre), 1, 0); DFS(row, col+1, now<<1|1, pre<<1|(!uPre), 1, 1); } if(!uPre) DFS(row, col+1, now<<1|uNow, pre<<1, 1, 1); DFS(row, col+1, now<<1|uNow, pre<<1|(!uPre), 0, 0); } int main() { scanf("%d%d", &M, &N); dp[0][(1<<N)-1] = 1; for(int i=1; i<=M; i++) DFS(i, 0, 0, 0, 0, 0); printf("%lld\n", dp[M][(1<<N)-1]); return 0; }
时间: 2024-10-23 13:45:33