本题是二进制枚举,加上dfs来的,至于情况的区分上跟上题有异曲同工之妙,
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=20;
const int INF=100000000;
int M[maxn][maxn],val[maxn][maxn],out[maxn][maxn];
int a[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};
int n,m;
int fun(int x,int y)
{
int temp=M[x][y];
for(int i=0;i<5;i++)
{
int xx=x+a[i][0];
int yy=y+a[i][1];
if(xx<1||xx>n||yy>m||yy<1) continue;
temp+=val[xx][yy];
}
return temp%2;
}
int dfs()
{
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(fun(i-1,j))
val[i][j]=1;
}
for(int j=1;j<=m;j++)
if(fun(n,j)) return -1;
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cnt+=val[i][j];
return cnt;
}
int main()
{
//freopen("D.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>M[i][j];
}
int re=INF;
for(int i=0;i<1<<m;i++)
{
memset(val,0,sizeof(val));
for(int j=1;j<=m;j++)
val[1][m-j+1]=i>>(j-1)&1;
int cnt=dfs();
if(cnt>=0&&cnt<re)
{
re=cnt;
memcpy(out,val,sizeof(val));
}
}
if(re==INF) cout<<"IMPOSSIBLE"<<endl;
else
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
cout<<out[i][j]<<" ";
}
cout<<out[i][m]<<endl;
}
}
}