HDU 5613-Baby Ming and Binary image
思路:枚举第一列地雷分布的全部状态,之后可对应逐步推得全图状态。再检查当前全图状态是否可行即可。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std; int mp[15][105]; int ans[15][105]; int ot[15][105]; int n,m; void cot() { for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cout<<ot[i][j]; if(j==m-1)cout<<endl; else cout<<" "; } } void init(int t) { memset(ans,0,sizeof(ans)); for(int i=1;i<=n-2;i++) { if( (t&(1<<(i-1))) !=0) ans[i][0]=1; else ans[i][0]=0; } } int getzt(int i,int j) { int sum=mp[i][j]; int cnt=0; cnt+=ans[i][j+1]; cnt+=ans[i][j]; cnt+=ans[i+1][j]; if(j-1>=0) { cnt+=ans[i][j-1]; cnt+=ans[i+1][j-1]; } if(i-1>=0) { cnt+=ans[i-1][j+1]; cnt+=ans[i-1][j]; if(j-1>=0) cnt+=ans[i-1][j-1]; } if(cnt==sum-1) return 1; else if(cnt==sum) return 0; else return -1; } bool check(int i,int j) { int sum=mp[i][j]; int cnt=0; cnt+=ans[i][j]; if(j+1<m) cnt+=ans[i][j+1]; if(j-1>=0) cnt+=ans[i][j-1]; if(i+1<n) { cnt+=ans[i+1][j]; if(j+1<m) cnt+=ans[i+1][j+1]; if(j-1>=0) cnt+=ans[i+1][j-1]; } if(i-1>=0) { cnt+=ans[i-1][j]; if(j+1<m) cnt+=ans[i-1][j+1]; if(j-1>=0) cnt+=ans[i-1][j-1]; } if(cnt==sum) return true; else return false; } bool pd() { for(int i=1;i<n;i++) { for(int j=1;j<m;j++) { ans[i][j]=getzt(i-1,j-1); if(ans[i][j]==-1) { return false; } } } for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(check(i,j)==false) return false; for(int i=0;i<m;i++) { if(ans[n-1][i]!=0) return false; if(ans[0][i]!=0) return false; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) ot[i][j]=ans[i][j]; return true; } int main() { int T; cin>>T; while(T--) { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>mp[i][j]; int cnt=0; for(int i=0;i<(1<<(n-2));i++) { init(i); if(pd()) { cnt++; if(cnt>=2) break; } } if(cnt==0) cout<<"Impossible"<<endl; else if(cnt>=2) cout<<"Multiple"<<endl; else cot(); } return 0; }