唉
#include<iostream> #include<algorithm> #include<cstring> #include<string> using namespace std; const int maxn = 16; int g[maxn][maxn]; int flip[maxn][maxn]; int ans[maxn][maxn]; int m,n,res = -1; int dx[]={-1,1,0,0,0}; int dy[]={0,0,0,1,-1}; void print(int mx[16][16]) { for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { printf("%d%c",mx[i][j],j+1==n?' ':' '); } } cout << endl; } int get(int x,int y) { int sum = g[x][y]; for(int i=0;i<5;i++) { int newx = x+dx[i]; int newy = y+dy[i]; if(newx>=0 && newx<m && newy>=0 && newy<n) { sum+=flip[newx][newy]; } } return sum%2; } int calc() { int number = 0; for(int i=0;i<n;i++) if(flip[0][i]==1) number++; for(int i=1;i<m;i++) { for(int j=0;j<n;j++) { if(get(i-1,j)) { number++; flip[i][j]=1; } } } for(int i=0;i<n;i++) if(get(m-1,i)) return -1; return number; } void solve() { for(int i=0;i < 1<<n;i++) { memset(flip,0,sizeof(flip)); for(int j=0;j<n;j++) { flip[0][n-1-j]=i>>j&1; int ret = calc(); //if(ret<res || res == -1) //if((res!=-1 && ret<res) || res == -1) //if(ret>=0) print(flip); if(ret>=0 && (ret<res || res == -1)) { res = ret; memcpy(ans,flip,sizeof(flip)); } } } if(res == -1) { cout<<"IMPOSSIBLE "; } else { for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { printf("%d%c",ans[i][j],j+1==n?' ':' '); } } } } int main(void) { cin >> m >> n; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) cin >> g[i][j]; } solve(); return 0; }