poj 2965

枚举:位运算版。

谢谢大牛们指导!

# include <iostream>
using namespace std;
const unsigned short int A[] = {0x111f, 0x222f, 0x444f, 0x888f,
                                0x11f1, 0x22f2, 0x44f4, 0x88f8,
                                0x1f11, 0x2f22, 0x4f44, 0x8f88,
                                0xf111, 0xf222, 0xf444, 0xf888
                               };
void Bitflip(unsigned short int * x, size_t h)
{
    size_t i = 0;
    for (; i < 16; ++i)
        if (h>>i & 0x1)
            *x ^= A[i];
}
size_t Bitcount(size_t i)
{
    size_t count = 0, j = 0;
    for (; j < 16; ++j)
        if (i>>j & 0x1) ++count;
    return count;
}
int main()
{
    char handle[4][4];
    unsigned short int h = 0x0, x, ans = 0;
    size_t i = 0, min = 17, c;

    for (i = 0; i < 4; ++i) cin >> handle[i];
    for (int j = 15; j >= 0; --j)
    {
        h <<= 1;
        if (handle[j/4][j%4] == '+')
            h |= 0x1;
    }
    for (i = 0; i <= 65535; ++i)
    {
        if ((c=Bitcount(i)) > min) continue;
        x = h;
        Bitflip(&x, i);
        if (x == 0)
        {
            min = c;
            ans = i;
        }
    }
    cout << min << endl;
    for (i = 0; i < 16; ++i)
        if (ans>>i & 0x1)
            cout <<i/4+1 << " " <<i%4+1 << endl;

    return 0;
} 
原文地址:https://www.cnblogs.com/JMDWQ/p/2262559.html