蒟蒻求助!状压版题50pts
查看原帖
蒟蒻求助!状压版题50pts
698768
adolf_stalin楼主2023/5/1 21:08

wa了#2#4#6#9#10求助神犇帮忙看看!!!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;

const int mod = 100000000  ;

int m ,n ;
int map[15][15] ;
long long f[15][1<<12+10] ;//i行 j状态

inline void add(long long &x , long long y){
	(x += y) >= mod ? x - mod : x ;
}

int main(){
	memset(map , -1 , sizeof map) ;
	scanf("%d%d" , &m , &n) ;
	for(int i = 1;i <= m;++i)	for(int j = 1;j <= n;++j)	scanf("%d" , &map[i][j]) ;
	f[0][0] = 1 ;
	for(int i = 0;i < m;++i){
		for(int z1 = 0;z1 < (1 << n);++z1){
			for(int z2 = 0;z2 < (1 << n);++z2){
				if(z1 & z2)	continue ;
				if((z2 & (z2 << 1)) || (z2 & (z2 >> 1))) continue ;
				
				int z = z2 ,flag = 0 ,cnt = 0 ;
				while(z){
					cnt++ ;
					if(z & 1){
						if(map[i + 1][cnt] == 0){
							flag = 1 ;
							break ;
						}
					}
					z >>= 1 ;
				}
				if(flag)	continue ;
				
				add(f[i + 1][z2] , f[i][z1]) ;
			}
		}
	}
	long long ans = 0 ;
	for(int i = 0;i < (1 << m);++i)	add(ans , f[m][i]) ;
	printf("%lld" , ans) ;
	return 0 ;
}
2023/5/1 21:08
加载中...