参照以前的棋盘问题,没啥好说的,等学了高斯消元法再重新来写一写
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
const double esp = 1e-6;
const double pi = acos(-1.0);
const long long INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int, int> pir;
int tox[] = { 0,1,0,-1,0 };
int toy[] = { 1,0,-1,0,0 };
int grp[6][7];
int n;
int cnt[6][7];
int check(int i,int j)
{
int sum = grp[i][j];
int x = i;
int y = j;
up(i, 0, 5)
{
int xx = x + tox[i];
int yy = y + toy[i];
if (xx >= 0 && xx <= 4 && yy >= 0 && yy <= 5)
{
sum += cnt[xx][yy];
}
}
return sum % 2;
}
int solve()
{
up(i, 1, 5)
{
up(j, 0, 6)
{
if (check(i - 1, j))cnt[i][j] = 1;
}
}
up(i, 0, 6)
if (check(4, i)) return 0;
up(i, 0, 5)
if (check(i, 5))return 0;
return 1;
}
int main()
{
cin >> n;
int op=1;
while (n--)
{
memset(cnt, 0, sizeof(cnt));
memset(grp, 0, sizeof(grp));
up(i, 0, 5)
{
up(j, 0, 6)
{
cin >> grp[i][j];
}
}
up(s, 0, (1 << 6))
{
up(j, 0, 6)
{
if (s >> j & 1)
cnt[0][5 - j] = 1;
}
if (solve())
{
printf("PUZZLE #%d\n", op++);
up(i, 0, 5)
{
up(j, 0, 6)
{
printf("%d%c", cnt[i][j], j == 5 ? '\n' : ' ');
}
}
break;
}
memset(cnt, 0, sizeof(cnt));
}
}
return 0;
}