感觉自己好蠢啊
其实跟上一道差不多嘛
每个点只会翻或不翻
然后你就会发现 枚举第一行就可以推出剩下的
对于i j 如果 i-1 j为黑 那么i j必定要翻
检验之后 记录一下答案就好了
PS :本弱菜想问个问题 如果这题的数据大一点呢 可以怎么做 如果有大神知道 请留言告诉我
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define me(a,x) memset(a,x,sizeof a)
#define cp(a,x) memcpy(a,x,sizeof a)
using namespace std;
const int N=17;
inline int read()
{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
bool b[N][N],p[N][N],g[N][N],l[N][N];
int n,m,ans;
void get()
{
int s=0,i,j;
cp(l,b);
for(i=2;i<=n;i++)
for(j=1;j<=m;j++)
if(b[i-1][j])
{
b[i-1][j]^=1,b[i][j]^=1,b[i+1][j]^=1;
b[i][j-1]^=1,b[i][j+1]^=1; p[i][j]=1;
}
else p[i][j]=0;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)
{
if(b[i][j]){cp(b,l); return;}
if(p[i][j])s++;
}
if(s<ans)cp(g,p),ans=s;
cp(b,l);
}
void dfs(int x)
{
if(x>m){ get(); return; }
dfs(x+1);
p[1][x]=1;
b[1][x-1]^=1,b[1][x]^=1,b[1][x+1]^=1,b[2][x]^=1;
dfs(x+1);
b[1][x-1]^=1,b[1][x]^=1,b[1][x+1]^=1,b[2][x]^=1;
p[1][x]=0;
}
int main()
{
int i,j; n=read(),m=read();
for(i=1;i<=n;i++)for(j=1;j<=m;j++)b[i][j]=read();
ans=n*m+1;
dfs(1);
if(ans==n*m+1)printf("IMPOSSIBLE\n");
else
for(i=1;i<=n;i++)
{
for(j=1;j<m;j++)printf("%d ",g[i][j]);
printf("%d\n",g[i][j]);
}
return 0;
}