题意:按一个开关,会对自身和与自身曼哈顿距离为d格子中的电灯产生影响。(开始看成曼哈顿距离<=d的,WA傻了。眼瞎。)。问:是否能从一个全是0的矩阵变成给出的矩阵。
思路:每个灯按或者不按作为参数。对于 (i,j) 处的电灯,在 (i,j) 处的电灯,和距离 (i,j) 曼哈顿距离为d的地方都可以对 (i,j) 处的电灯造成影响,对于每个 (i,j) 建一个方程,总共 n∗m 个方程。x数组就是给出的矩阵。
我的思路来源是这里,把这个看懂了,这一题也就懂了。
我是在vjudge上提交的,所以给个vjudge的提交地址。
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17230
/*********************************************
Problem : UVALive 5070
Author : NMfloat
InkTime (c) NM . All Rights Reserved .
********************************************/
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = (a) ; i <= (b) ; i ++) //遍历
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --) //反向遍历
#define repS(it,p) for(auto it = p.begin() ; it != p.end() ; it ++) //遍历一个STL容器
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) //遍历u所连接的点
#define cls(a,x) memset(a,x,sizeof(a))
#define eps 1e-8
using namespace std;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;
typedef long long LL;
typedef unsigned long long ULL;
int T,n,m,d;
int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};
int a[700][700];
int x[700];
int ans[700]; int equ;
bool vis[26][26];
int tr(int x,int y) {
return (x-1) * m + y;
}
void debug() {
rep(i,1,equ) {
rep(j,1,equ) {
printf("%d ",a[i][j]);
}
printf("= %d\n",x[i]);
}
puts("");
}
bool gauss() {// 0代表无解,1代表有解
// debug();
rep(i,1,equ) {
int maxd = 0;
rep(j,i,equ) if(a[j][i]) { maxd = j; break;}
if(!maxd) continue;
if(maxd != i) {
rep(j,i,equ) swap(a[maxd][j],a[i][j]);
swap(x[maxd],x[i]);
}
rep(j,1,equ) {
if(j == i) continue;
if(!a[j][i]) continue;
rep(k,i,equ) {
a[j][k] ^= a[i][k];
}
x[j] ^= x[i];
}
//debug();
}
// debug();
rep(i,1,equ) {
if(a[i][i] == 0 && x[i]) return false;
}
// debug();
return true;
}
// bool Map[26][26];
// void out() {
// rep(i,1,n) {
// rep(j,1,m) printf("%d ",Map[i][j]);
// puts("");
// }
// puts("");
// }
// void render() {
// cls(Map,0);
// rep(i,1,n) {
// rep(j,1,m) {
// if(x[tr(i,j)]) {
// //染色开始
// rep(ia,1,n) {
// rep(ib,1,m) {
// if(abs(i-ia)+abs(j-ib)==d) Map[ia][ib] ^= 1;
// }
// }
// }
// }
// }
// out();
// }
void input() {
rep(i,1,n) rep(j,1,m) scanf("%d",&x[tr(i,j)]);
}
void solve() {
//列方程
cls(a,0);
rep(i,1,n) rep(j,1,m) {
//曼哈顿距离为d的都会对(i,j)造成影响
a[tr(i,j)][tr(i,j)] = 1;
rep(ia,1,n) rep(ib,1,m) {
if(abs(i-ia)+abs(j-ib) == d) a[tr(i,j)][tr(ia,ib)] = 1;
}
}
equ = tr(n,m);
printf("%d\n",gauss());
// render();
}
int main(void) {
//freopen("a.in","r",stdin);
while(scanf("%d %d %d",&m,&n,&d),n+m+d) {
input();
solve();
}
return 0;
}