3254Corn Fields
终于通过了啊,代码有些长,不过它是我自己做的第一道状态压缩题目,自主创作的
#include "iostream" #include "string.h" #include "algorithm" using namespace std; int dp[15][177147]; int n,map[15][15]; bool init(int a){ for(int i=0;i<n;i++){ if((a&(1<<i))>0){ if(map[0][i]==0)return 0; if(i==n-1)return 1; if((a&(1<<(i+1)))>0)return 0; } } return 1; } bool text(int j,int a){ for(int i=0;i<n;i++){ if((a&(1<<i))>0){ if(map[j][i]==0)return 0; if(i==n-1)return 1; if((a&(1<<(i+1)))>0)return 0; } } return 1; } bool tran(int j,int a,int b){ for(int i=0;i<n;i++){ if((a&(1<<i))>0){ if((b&(1<<i))>0)return 0; if(map[j][i]==0&&(b&(1<<i))>0)return 0; if(i==n-1)return 1; if((b&(1<<i))>0&&(b&(1<<(i+1)))>0)return 0; } } return 1; } int main(){ int i,m,j,k,z; while(cin>>m>>n){ for(i=0;i<m;i++){ for(j=0;j<n;j++) cin>>map[i][j]; } z=(1<<n); int sum1=0; memset(dp,0,sizeof(dp)); for(i=0;i<z;i++){ if(init(i)){ dp[0][i]=1; sum1+=dp[0][i]; } } int sum=0; for(i=1;i<m;i++){ for(j=0;j<z;j++){ dp[i][j]=0; if(text(i,j)) //考虑有可能那个位置不可以放牛,可是把它算进去了 for(k=0;k<z;k++){ if(tran(i,k,j)) dp[i][j]+=dp[i-1][k]; } if(i==m-1)sum+=dp[i][j]; } } if(sum==0)sum=sum1; /* for(i=0;i<m;i++){ for(j=0;j<z;j++){ cout<<dp[i][j]<<' '; } cout<<endl; }*/ sum=sum%100000000; cout<<sum<<endl; } }