题目:
https://vjudge.net/contest/169035#problem/D
通用思路:
https://blog.youkuaiyun.com/ac_hell/article/details/51077320
题解:
https://www.cnblogs.com/caitian/p/5396946.html
代码:
//4
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAXN 20
#define INF 0x3f3f3f3f
int Map[MAXN][MAXN];
int A[MAXN][MAXN];
int bestA[MAXN][MAXN];
int dx[5]={-1,0,0,1,0};
int dy[5]={0,1,0,0,-1};
int R,C;
int getcolor(int x,int y)
{
int i;
int num;
int xt,yt;
num=Map[x][y];
for(i=0;i<5;i++)
{
xt=x+dx[i];
yt=y+dy[i];
if(xt<=0||xt>R||yt<=0||yt>C)
continue;
num+=A[xt][yt];
}
return num%2;
}
int solve()
{
int i,j;
int num;
for(i=2;i<=R;i++)
for(j=1;j<=C;j++)
if(getcolor(i-1,j))
A[i][j]=1;
for(i=1;i<=C;i++)//检查最后一行
if(getcolor(R,i))
return INF;
num=0;
for(i=1;i<=R;i++)
for(j=1;j<=C;j++)
num+=A[i][j];
return num;
}
int main()
{
int i,j;
int s;//第一行状态
int ans_t,ans;
scanf("%d%d",&R,&C);
for(i=1;i<=R;i++)
for(j=1;j<=C;j++)
scanf("%d",&Map[i][j]);
ans=INF;
for(s=0;s< 1<<C;s++)//枚举第一行状态
{
memset(A,0,sizeof(A));
for(i=1;i<=C;i++)
A[1][i]=s >>(C-i) &1;
ans_t=solve();
if(ans_t<ans)
{
ans=ans_t;
for(i=1;i<=R;i++)
for(j=1;j<=C;j++)
bestA[i][j]=A[i][j];
}
}
if(ans==INF)
printf("%s\n","IMPOSSIBLE");
else
{
for(i=1;i<=R;i++)
{
printf("%d",bestA[i][1]);
for(j=2;j<=C;j++)
printf(" %d",bestA[i][j]);
printf("\n");
}
}
return 0;
}