#define A(c)for(i=0;i<64;++i)for(m=j=0;j<64;++j)if(x=i/8-j/8,y=i%8-j%8,t=abs(x)-abs(y)?y?x?0:(y>0)+1:(x>0)+1<<2:16<<(x>0)+(y>0)*2,j-i&&b[i]*b[j]*t*!(m&t))c;
i,j,m,t,y,x;f(*b,*r){*r=0;A((b[i]++,m|=t))A(*r|=b[i]^b[j])}
int
main(void)
{
struct {
int expected;
int board[65];
} tests[] = {
0, L"...................Q.....................Q.Q..Q..Q.............Q",
0, L".........Q.Q.Q..................................................",
1, L"................................................................",
1, L"....................................Q...........................",
1, L"...........Q.....................Q..............................",
1, L"..................QQ............................................",
1, L".................Q.Q.....................Q.Q....................",
1, L"Q......Q.........Q....Q.................................Q......Q",
1, L"Q......Q..Q..Q...Q..Q.Q...Q..........Q...Q.Q..Q...Q..Q..Q......Q",
};
for (int i=0; i<sizeof tests/sizeof*tests; ++i) {
for (int j=0; j<64; ++j)
tests[i].board[j] -= '.';
int result;
f(tests[i].board, &result);
printf("result: %d, expected: %d\n", !result
, tests
[i
].
expected); }
}
I2RlZmluZSBBKGMpZm9yKGk9MDtpPDY0OysraSlmb3IobT1qPTA7ajw2NDsrK2opaWYoeD1pLzgtai84LHk9aSU4LWolOCx0PWFicyh4KS1hYnMoeSk/eT94PzA6KHk+MCkrMTooeD4wKSsxPDwyOjE2PDwoeD4wKSsoeT4wKSoyLGotaSYmYltpXSpiW2pdKnQqIShtJnQpKWM7CmksaixtLHQseSx4O2YoKmIsKnIpeypyPTA7QSgoYltpXSsrLG18PXQpKUEoKnJ8PWJbaV1eYltqXSl9CgppbnQKbWFpbih2b2lkKQp7CiAgICBzdHJ1Y3QgewogICAgICAgIGludCBleHBlY3RlZDsKICAgICAgICBpbnQgYm9hcmRbNjVdOwogICAgfSB0ZXN0c1tdID0gewogICAgICAgIDAsIEwiLi4uLi4uLi4uLi4uLi4uLi4uLlEuLi4uLi4uLi4uLi4uLi4uLi4uLi5RLlEuLlEuLlEuLi4uLi4uLi4uLi4uUSIsCiAgICAgICAgMCwgTCIuLi4uLi4uLi5RLlEuUS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKICAgICAgICAxLCBMIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAogICAgICAgIDEsIEwiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uUS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCiAgICAgICAgMSwgTCIuLi4uLi4uLi4uLlEuLi4uLi4uLi4uLi4uLi4uLi4uLi5RLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKICAgICAgICAxLCBMIi4uLi4uLi4uLi4uLi4uLi4uLlFRLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAogICAgICAgIDEsIEwiLi4uLi4uLi4uLi4uLi4uLi5RLlEuLi4uLi4uLi4uLi4uLi4uLi4uLi5RLlEuLi4uLi4uLi4uLi4uLi4uLi4uLiIsCiAgICAgICAgMSwgTCJRLi4uLi4uUS4uLi4uLi4uLlEuLi4uUS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlEuLi4uLi5RIiwKICAgICAgICAxLCBMIlEuLi4uLi5RLi5RLi5RLi4uUS4uUS5RLi4uUS4uLi4uLi4uLi5RLi4uUS5RLi5RLi4uUS4uUS4uUS4uLi4uLlEiLAogICAgfTsKICAgIGZvciAoaW50IGk9MDsgaTxzaXplb2YgdGVzdHMvc2l6ZW9mKnRlc3RzOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqPTA7IGo8NjQ7ICsraikKICAgICAgICAgICAgdGVzdHNbaV0uYm9hcmRbal0gLT0gJy4nOwogICAgICAgIGludCByZXN1bHQ7CiAgICAgICAgZih0ZXN0c1tpXS5ib2FyZCwgJnJlc3VsdCk7CiAgICAgICAgcHJpbnRmKCJyZXN1bHQ6ICVkLCBleHBlY3RlZDogJWRcbiIsICFyZXN1bHQsIHRlc3RzW2ldLmV4cGVjdGVkKTsKICAgIH0KfQ==