51nod2615 修改01矩阵(状态压缩+搜索)

题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=2615

思路:n比较小,状态压缩首行每位是否翻转,则后续每行的状态都已确定,当前行是否翻转需要看上一行当前位置是否为0,翻转结束后看最后一行是全为0即可。

代码如下:

#include 
#include 

using namespace std;
#define LL long long
int n;
int arr[11][11];
int num[11][11];

void flip(int x, int y)
{
    arr[x+1][y] ^= 1;
    arr[x-1][y] ^= 1;
    arr[x][y+1] ^= 1;
    arr[x][y-1] ^= 1;
    arr[x][y] ^= 1;
}

int main()
{
    while(cin >> n )
    {
        memset(num, 0, sizeof(num));
        for(int i = 1 ; i <= n ; i ++)
        {
            for(int j = 1 ; j <= n; j ++)
            {
                cin >> arr[i][j];
                num[i][j] = arr[i][j];
            }
        }
        int flag = 1;
        for(int i = 0 ; i < (1 << n) ; i ++)
        {
            for(int j = 1 ; j <= n; j ++)
            {
                for(int k = 1 ; k <= n ; k ++)
                {
                    arr[j][k] = num[j][k];
                }
            }
            for(int j = 1 ; j <= n ; j ++)
            {
                if((i >> (j - 1)) & 1) flip(1, j);
            }
            for(int k = 2 ; k <= n ; k ++)
            {
                for(int j = 1 ; j <= n ; j ++)
                {
                    if(arr[k-1][j])
                        flip(k, j);
                }
            }
            int flag2 = 0;
            for(int k = 1 ; k <= n ; k ++)
            {
                if(arr[n][k])
                {
                    flag2 ++;
                }
            }
            if(flag2 == 0) 
            {
                flag = 0;
                break;
            }
        }

        if(flag) cout << "No" << endl;
        else cout << "Yes" << endl;

    }
    return 0;
}

 

你可能感兴趣的:(搜索)