POJ 3279
2016-03-07 19:19
357 查看
#include<cstdio> #include<string.h> using namespace std; const int maxn=30; int a[maxn][maxn],b[maxn][maxn],ans[maxn][maxn]; int m,n,f; int check(int k) { for(int i=0;i<n;i++) { if(k&(1<<i)) { ans[0][i]=1; b[0][i]^=1; if(1<m)b[1][i]^=1; if(i-1>=0)b[0][i-1]^=1; if(i+1<n)b[0][i+1]^=1; } } for(int i=1;i<m;i++) { for(int j=0;j<n;j++) { if(b[i-1][j]==1) { ans[i][j]=1; b[i][j]^=1; b[i-1][j]^=1; if(i+1<m) b[i+1][j]^=1; if(j+1<n) b[i][j+1]^=1; if(j-1>=0) b[i][j-1]^=1; } } } for(int j=0;j<n;j++) { if(b[m-1][j]==1) return 0; } return 1; } int main() { int i,j; while(scanf("%d%d",&m,&n)==2) { for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { scanf("%d",&a[i][j]); } } f=0; for(i=0;i<(1<<n);i++) { memcpy(b,a,sizeof(a)); memset(ans,0,sizeof(ans)); if(check(i)) { f=1; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(j==n-1) printf("%d\n",ans[i][j]); else printf("%d ",ans[i][j]); } } break; } } if(!f) printf("IMPOSSIBLE\n"); } return 0; }
改题的想法不错,先考虑第一行的解决方案的种类,对于题目的例子则可以有16中方案 如0 0 0 0\0 0 0 1\0 0 1 0.....等等对于每一种方案,再进行之下的几行的做法.对于题目中说的考虑什么字典序,感觉是个小坑,没有什么考虑也是可以AC的.
然后这个题目很大得学习到了ACM里的位运算和二进制的运算方法和许多的小技巧.
相关文章推荐
- 1099. Build A Binary Search Tree (30) 给定二叉搜索树插值
- VMware Workstation 12 Pro 虚拟机的使用(一)介绍
- iOS开发------类似UI浏览器上方的滚动状态栏
- hdu 3038 How Many Answers Are Wrong(并查集变种)
- 使用Get和Post提交数据的实现和差别
- LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
- 一个问题帮助理解 Binder 机制
- zcmu1102
- 广度优先遍历队列实现
- obj文件
- python小点心--内存文件映射
- mysql服务启动不了
- bzoj 1087: [SCOI2005]互不侵犯King 状压dp
- IPv6与IPv4,IPv6普及难的原因
- 机器学习系列(7)_机器学习路线图(附资料)
- ListView设置EmptyView
- mysql 性能优化方案
- 不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux
- idea-multimarkdown 插件破解小记
- OC - 3D Touch(2)