30pts求助,代码简单易懂
查看原帖
30pts求助,代码简单易懂
218752
smy2006楼主2021/9/12 19:42

RT,结构体里的cnt和函数里的cnt没啥用,忽略就好,写代码的时候脑抽加的

#include<iostream>
using namespace std;
int m,n,l;
int Map[20][20];
struct Node{
	long long stt,cnt;
}s[1020];
void dfs(int pos,int cnt,int state){
	if(pos>=m){
		s[++l].stt=state;s[l].cnt=cnt;
		return;
	}
	dfs(pos+1,cnt,state);
	dfs(pos+2,cnt+1,state+(1<<pos));
}
long long f[20][1200];
bool check(int line,long long st){
	for(int i=1; i<=m; i++){
		if(st&1==1 && Map[line][i]==0){ return false;}
		st=(st>>1);
	}
	return true;
}
int main(){
	cin>>n>>m;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=m; j++){
			cin>>Map[i][j];
		}
	}
	dfs(0,0,0);
	//f[0][0]=1;
	for(int i=1; i<=l; i++){
		f[1][i]=1;
	}
//	for(int i=1; i<=l; i++){
//		cout<<s[i].cnt<<" "<<s[i].stt<<endl;
//	}
	for(int i=2; i<=n; i++){
		for(int j=1; j<=l; j++){//本行 
			for(int k=1; k<=l; k++){
				if(s[j].stt&s[k].stt) continue;
				if(check(i,s[j].stt)){
			        f[i][j]=(f[i][j]+f[i-1][k])%1000000000;
			    }
			}
		}
	}
	long long ans=0;
	for(int i=1; i<=l; i++){
		ans=(ans+f[n][i])%1000000000;
	}
	cout<<ans<<endl;
} 
2021/9/12 19:42
加载中...