indeed contenst

#include <iostream>
#include <vector>
using namespace std;

char g[6][7];
int row[6];
int f[6][1<<6][1<<12];


inline bool valid(int x) {
	int ret = 0;
	while(x) {
		x &= (x-1);
		ret += 1;
	}
	return ret == 3;
}

int pre(int k, int j) {
	int col[6] = {0};
	
	for(int i = 0; i < 6; i++) {
		col[i] = k%4;
		k = k/4;
	}

	for(int i = 5; i >= 0; i--) {
		int num = (1 & (j>>i));
		col[i] -= num;
		if(col[i] < 0) return -1;
	}

	int ret = 0;

	for(int i = 5; i >= 0; i--) {
		ret = 4*ret+col[i];
	}

	return ret;
}
int main() {
	const int n=6;
	for(int i = 0; i < 6; i++) {
		scanf("%s", g[i]);
		for(int j=0; j<n; j++) {
			row[i] = (row[i]<<1) | (g[i][j]=='.' ? 0:1);
		}
	}

	for(int j=0; j < (1<<n); j++) {
		if((j & row[0]) != row[0] || !valid(j)) continue;
		
		int k = 0;

		for(int i=5; i>=0; i--) {
			k = k*4 + (j & (1<<i) ? 1:0);
		}

		f[0][j][k] = 1;
	}

	for(int i=1; i<n; i++) {
		for(int j=0; j < (1<<n); j++) {
			if((j & row[i]) != row[i] || !valid(j)) continue;
			
			int k = 0;

			for(k = 0; k < (1<<12); k++) {
				int k2 = pre(k, j);
				if(k2 == -1) continue;

				for(int j2=0; j2<(1<<n); j2++) {
					f[i][j][k] += f[i-1][j2][k2];
				}
			}
		}
	}

	int res = 0;

	for(int i=0; i<(1<<n); i++) {
		res += f[5][i][(1<<12)-1];
	}

	cout << res << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值