题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=2615
思路:n比较小,状态压缩首行每位是否翻转,则后续每行的状态都已确定,当前行是否翻转需要看上一行当前位置是否为0,翻转结束后看最后一行是全为0即可。
代码如下:
#include <iostream>
#include <bits/stdc++.h>
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;
}