#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,m,map[21][21],fi[21][21],oi[21][21],d[5][2] = {{1,0},{-1,0},{0,0},{0,-1},{0,1}};
int panduan(int x,int y)//查询(x,y)的颜色
{
int i,c=map[x][y];
for(i=0;i<5;++i)
{
int x2=x+d[i][0],y2=y+d[i][1];
if(0<=x2&&x2<n&&0<=y2&&y2<m)
c+=fi[x2][y2];
}
return c%2;
}
int solve()
{
int i,j,res;
for(i=1;i<n;++i)
{
for(j=0;j<m;++j)
{
if(panduan(i-1,j)!=0)//上方格子是黑色,必须必须反转(i,j)号格子
fi[i][j]=1;
}
}
for(i=0;i<m;++i)//判断最后一行是否全白
{
if(panduan(n-1,i)!=0)//当前方案不行
return -1;
}
res=0;
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
{
res+=fi[i][j];//统计当前方案的反转次数
}
}
return res;
}
int main()
{
int i,j,ans,num;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
scanf("%d",&map[i][j]);
}
ans=-1;
//按照字典序尝试第一行所有的可能性,方案为2^m种
for(i=0;i< 1<<m;++i)
{
memset(fi,0,sizeof(fi));
for(j=0;j<m;++j)
fi[0][m-j-1]=i>>j&1;
num=solve();
if(num>=0&&(ans<0||ans>num))
{
ans=num;
memcpy(oi,fi,sizeof(fi));//把flip数组复制给opt数组
}
}
if(ans==-1)
printf("IMPOSSIBLE\n");
else
{
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
{
if(j==m-1)
printf("%d\n",oi[i][j]);
else
printf("%d ",oi[i][j]);
}
}
}
}
return 0;
}
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,m,map[21][21],fi[21][21],oi[21][21],d[5][2] = {{1,0},{-1,0},{0,0},{0,-1},{0,1}};
int panduan(int x,int y)//查询(x,y)的颜色
{
int i,c=map[x][y];
for(i=0;i<5;++i)
{
int x2=x+d[i][0],y2=y+d[i][1];
if(0<=x2&&x2<n&&0<=y2&&y2<m)
c+=fi[x2][y2];
}
return c%2;
}
int solve()
{
int i,j,res;
for(i=1;i<n;++i)
{
for(j=0;j<m;++j)
{
if(panduan(i-1,j)!=0)//上方格子是黑色,必须必须反转(i,j)号格子
fi[i][j]=1;
}
}
for(i=0;i<m;++i)//判断最后一行是否全白
{
if(panduan(n-1,i)!=0)//当前方案不行
return -1;
}
res=0;
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
{
res+=fi[i][j];//统计当前方案的反转次数
}
}
return res;
}
int main()
{
int i,j,ans,num;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
scanf("%d",&map[i][j]);
}
ans=-1;
//按照字典序尝试第一行所有的可能性,方案为2^m种
for(i=0;i< 1<<m;++i)
{
memset(fi,0,sizeof(fi));
for(j=0;j<m;++j)
fi[0][m-j-1]=i>>j&1;
num=solve();
if(num>=0&&(ans<0||ans>num))
{
ans=num;
memcpy(oi,fi,sizeof(fi));//把flip数组复制给opt数组
}
}
if(ans==-1)
printf("IMPOSSIBLE\n");
else
{
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
{
if(j==m-1)
printf("%d\n",oi[i][j]);
else
printf("%d ",oi[i][j]);
}
}
}
}
return 0;
}