题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65959#problem/D
话说这个问题的思路是,枚举第一行,然后进行模拟,但是还是不怎么能懂,看了bin神的代码,自己差不多原样写了下来,但是,有的地方还是不怎么能懂。
知道是按顺序模拟,但还是,没能完全理解透,相信时间会解决的。
发下代码:
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int map[20][20],map2[20][20],ans[20][20];
int M,N;
int d[][2]={{0,1},{0,-1},{1,0},{-1,0},{0,0}};
int isok(int n){
memset(ans,0,sizeof(ans));
memcpy(map2,map,sizeof(map2));
for(int j=0;j<N;j++)
map2[0][j+1]=(n>>j)%2;
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++){
if(!map2[i-1][j]) continue;
ans[i][j]=1;
for(int p=0;p<5;p++)
map2[i+d[p][0]][j+d[p][1]]=!map2[i+d[p][0]][j+d[p][1]];
}
for(int j=1;j<=N;j++)
if(map2[M][j]) return 0;
return 1;
}
int main(){
while(cin>>M)
{
cin>>N;
if(!M && !N) break;
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++)
cin>>map[i][j];
int op=0;
for(int i=0;i<(1<<N);i++)
if(isok(i)){
op=1;
break;
}
if(op){
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++)
if(j==N) cout<<ans[i][j]<<endl;
else cout<<ans[i][j]<<" ";
}
else cout<<"IMPOSSIBLE\n";
}
return 0;
}