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;
  }
}
原文地址:https://www.cnblogs.com/dowson/p/3305487.html