题目大意:看图就知道题目大意了
解题思路:每一位分开进行计算判断
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAXNODE = 1010;
const int N = 510;
bool mark[MAXNODE];
vector<int> G[MAXNODE];
int Stack[MAXNODE];
int n, m, top;
int num[N][N];
void init() {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &num[i][j]);
}
void AddClause(int x, int valx, int y, int valy) {
x = x * 2 + valx;
y = y * 2 + valy;
G[x].push_back(y);
}
bool dfs(int u) {
if (mark[u ^ 1]) return false;
if (mark[u]) return true;
mark[u] = true;
Stack[++top] = u;
for (int i = 0; i < G[u].size(); i++)
if (!dfs(G[u][i])) return false;
return true;
}
bool judge() {
for (int i = 0; i < 2 * n; i += 2)
if (!mark[i] && !mark[i ^ 1]) {
top = 0;
if (!dfs(i)) {
while (top) mark[Stack[top--]] = false;
if (!dfs(i ^ 1)) return false;
}
}
return true;
}
void solve() {
for (int i = 0; i <= 31; i++) {
for (int j = 0; j < 2 * n; j++)
G[j].clear();
memset(mark, 0, sizeof(mark));
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++) {
if (j == k) continue;
else if (j % 2 == 1 && k % 2 == 1) {
if ( (num[j][k] >> i ) & 1) {
AddClause(j, 0, k, 1);
AddClause(k, 0, j, 1);
}
else {
AddClause(j, 1, j, 0);
AddClause(k, 1, k, 0);
}
}
else if (j % 2 == 0 && k % 2 == 0) {
if ( (num[j][k] >> i) & 1) {
AddClause(j, 0, j, 1);
AddClause(k, 0, k, 1);
}
else {
AddClause(j, 1, k, 0);
AddClause(k, 1, j, 0);
}
}
else {
if ( (num[j][k] >> i) & 1) {
AddClause(j, 0, k, 1);
AddClause(k, 0, j, 1);
AddClause(j, 1, k, 0);
AddClause(k, 1, j, 0);
}
else {
AddClause(j, 0, k, 0);
AddClause(j, 1, k, 1);
AddClause(k, 1, j, 1);
AddClause(k, 0, j, 0);
}
}
}
if (!judge()) {
printf("NO\n");
return ;
}
}
printf("YES\n");
}
int main() {
while (scanf("%d" ,&n) != EOF) {
init();
solve();
}
return 0;
}