【搜索】Fliptile
#include<stdio.h> #include<stdlib.h> #include<string.h> const int maxn=20; const int inf=210000; typedef long long ll; int m,n; int opt[maxn][maxn]; int a[maxn][maxn]; int tmp[maxn][maxn]; int dx[]= {0,0,1,-1,0}; int dy[]= {-1,1,0,0,0}; int getcolor(int x,int y) { int ans=a[x][y]; for(int i=0; i<5; i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=0&&xx<m&&yy>=0&&yy<n) ans+=tmp[xx][yy]; } return ans%2; } int cal() { int i,j; for(i=1; i<m; i++) for(j=0; j<n; j++) if(getcolor(i-1,j)) tmp[i][j]=1; for(i=0;i<n;i++) if(getcolor(m-1,i))return -1; int ans=0; for(i=0;i<m;i++) for(j=0;j<n;j++) ans+=tmp[i][j]; return ans; } void solve() { int rec=-1; int i,j; for(i=0;i<1<<n;i++) { memset(tmp,0,sizeof(tmp)); for(j=0;j<n;j++) { tmp[0][n-j-1]=i>>j&1; } int num=cal(); if(num>=0&&(rec>num||rec<0)) { rec=num; memcpy(opt,tmp,sizeof(tmp)); } } if(rec<0) printf("IMPOSSIBLE\n"); else { for(i=0;i<m;i++) { for(j=0;j<n;j++) printf("%d%c",opt[i][j],j==n?'\n':' '); printf("\n"); } } } int main() { int i,j,t,k; while(~scanf("%d%d",&m,&n)) { for(i=0; i<m; i++) for(j=0; j<n; j++) scanf("%c",&a[i][j]); solve(); } return 0; }
posted on 2017-02-12 22:53 KID_XiaoYuan 阅读(129) 评论(0) 编辑 收藏 举报