一个简单的搜索,通过查找第一行的全部可能确定后面的选择。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=1000000000;
int M,N;
int map[20][20],r[20][20],ans[20][20];
int dx[]={-1,0,0,0,1},dy[]={0,1,0,-1,0};
int get(int x,int y){
int res=map[x][y];
for(int i=0;i<5;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<M&&b>=0&&b<N)
res+=r[a][b];
}
return res&1;
}
int findLess(){
for(int i=1;i<M;i++)
for(int j=0;j<N;j++)
if(get(i-1,j))
r[i][j]=1;
for(int i=0;i<N;i++)
if(get(M-1,i)) return MAXN;
int res=0;
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
res+=r[i][j];
return res;
}
int main() {
while(~scanf("%d %d",&M,&N)){
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
scanf("%d",&map[i][j]);
int res=MAXN;
memset(r,0, sizeof(r));
for(int i=0;i< 1<<N;i++){
memset(r,0, sizeof(r));
for(int j=0;j<N;j++)
r[0][j]=i>>j&1;
int t=findLess();
if(t<res){
res=t;
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
ans[i][j]=r[i][j];
}
}
if(res==MAXN){
printf("IMPOSSIBLE\n");
continue;
}
for(int i=0;i<M;i++) {
for (int j = 0; j < N; j++)
printf("%d ", ans[i][j]);
printf("\n");
}
}
return 0;
}