1 solutions
-
0
C++ :
#include<bits/stdc++.h> using namespace std; const int N=14,M=1<<12; const int P=1e8; int n,m; typedef long long LL; LL f[N][M]; vector<int> state,h[M]; //state 表示合法的状态集合 h[i]表示第i个状态可以到的合法转移 int g[N]; //换的土地的集合 bool check(int x) //获得合法状态 { for(int i=0;i<m;i++) { if(x>>i&1&&(x>>i+1&1)) return false; } return true; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=0;j<m;j++) { int x; cin>>x; if(x==0) //使用二进制的形式得到坏田的集合 { g[i]+=(1<<j); } } } for(int i=0;i<(1<<m);i++) //枚举所有合法状态 { if(check(i)) { state.push_back(i); } } for(int i=0;i<state.size();i++) //第i行的状态 { for(int j=0;j<state.size();j++) //第i-1行的状态 { int a=state[i],b=state[j]; if((a&b)==0) //上下挨着的 { h[i].push_back(j); } } } f[0][0]=1; //初始状态 for(int i=1;i<=n+1;i++) //枚举到第n+1行,这样就不用枚举最后一行的情况 { for(int j=0;j<state.size();j++) //第i行的状态 { for(int k=0;k<h[j].size();k++) //第i-1行的状态 { int a=state[j],b=state[h[j][k]]; if(a&g[i]) continue; //第i行的状态和坏土地有重合 f[i][a]=(f[i][a]+f[i-1][b])%P; //累加方案 } } } cout<<f[n+1][0]; //等价于第n+1行,一个都不放的方案数 return 0; }
- 1
Information
- ID
- 761
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By