CodeChef-DAILY : Daily Train

問題概要(適当)

全探索すれば解ける問題。

acceptされたコード

#include <cstdio>
using namespace std;

const int MAX_L = 54;

char buf[MAX_L + 1];

int box[9][6];

int solve(){
	int X, N;
	scanf("%d%d ", &X, &N);

	int ans = 0;
	for(int k=0; k<N; k++){
		scanf(" %s ", buf);
		for(int j=0; j<9; j++){
			for(int bit=0; bit<(1<<6); bit++)if(__builtin_popcount(bit) == X){
				bool ok = true;
				for(int i=0; i<6; i++)if((bit>>i)&1){
					ok &= buf[box[j][i]] == '0';
				}
				if(ok){
					ans++;
				}
			}
		}
	}

	return ans;
}

void prepare(){
	int p[9] = {};
	for(int i=0; i<36; i++){
		box[i/4][p[i/4]++] = i;
	}

	for(int i=36; i<54; i++){
		box[8-(i-36)/2][p[8-(i-36)/2]++] = i;
	}

}

int main(){
	prepare();
	printf("%d\n", solve());

	return 0;
}