考试想到了状压,苦于T1废掉太长时间,于是默默输出impossible。。
我们知道,一个格子的翻转受其翻转次数和它相邻翻转次数的影响。
由每一个位置操作两次相当于把它翻过来又翻回去,所以答案中每一个点操作次数为0或1。
然后我们枚举第一行的状态,1代表翻转,0代表不翻转。
如果与它相连的点的操作次数和它本身状态之和为偶数,它就会被翻成白色。
由于我们从上向下推,所以对于上一行的点来说,只有它下面那一个点不确定,我们就让下面这一个点进行能够让上一行点满足全为白色的操作。
这样推到最后一行,前面m-1行都满足,我们只需要看最后一行是否满足就可以了。
最后一行满足,就说明这种方案合法,再去更新之前存下的合法方案就可以了。

例如此位置本身与上左右状态之和为偶数,而此位置在初始时是1,所以我们需要把它翻成0,需要奇数个操作,所以我们把它下面的状态设置为1即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. #define pos(i,a,b) for(int i=(a);i<=(b);i++)
  6. #define N 20
  7. int n,m;
  8. int a[N][N],temp[N][N],ans[N][N];
  9. int work(int i){
  10. pos(j,1,n){
  11. if(j==1){
  12. pos(k,1,m)
  13. if((1<<(m-k))&i){
  14. temp[j][k]=1;
  15. }
  16. }
  17. pos(k,1,m){
  18. if(j!=n){
  19. if((temp[j][k-1]+temp[j][k+1]+temp[j-1][k]+temp[j][k])%2==0){
  20. if(a[j][k]){
  21. temp[j+1][k]=1;
  22. }
  23. else{
  24. temp[j+1][k]=0;
  25. }
  26. }
  27. else{
  28. if(a[j][k]==0){
  29. temp[j+1][k]=1;
  30. }
  31. else{
  32. temp[j+1][k]=0;
  33. }
  34. }
  35. }
  36. if(j==n){
  37. if((temp[j][k-1]+temp[j][k+1]+temp[j-1][k]+temp[j][k])%2==0){
  38. if(a[j][k]){
  39. return 0;
  40. }
  41. }
  42. else{
  43. if(!a[j][k])
  44. return 0;
  45. }
  46. }
  47. }
  48. }
  49. return 1;
  50. }
  51. int flag;
  52. int count(){
  53. int sum1=0,sum2=0;;
  54. pos(i,1,n){
  55. pos(j,1,m){
  56. if(temp[i][j])
  57. sum1++;
  58. if(ans[i][j])
  59. sum2++;
  60. }
  61. }
  62. if(sum1<sum2)
  63. return 1;
  64. return 0;
  65. }
  66. void update(){
  67. if(flag){
  68. if(count()){
  69. pos(i,1,n)
  70. pos(j,1,m)
  71. ans[i][j]=temp[i][j];
  72. }
  73. else{
  74. pos(i,1,n){
  75. pos(j,1,m){
  76. if(temp[i][j]<ans[i][j]){
  77. pos(k,1,n){
  78. pos(l,1,m){
  79. ans[k][l]=temp[k][l];
  80. }
  81. }
  82. }
  83. else{
  84. return;
  85. }
  86. }
  87. }
  88. }
  89. }
  90. else{
  91. pos(i,1,n)
  92. pos(j,1,m)
  93. ans[i][j]=temp[i][j];
  94. flag=1;
  95. }
  96. }
  97. int main(){
  98. //freopen("fliptile.in","r",stdin);
  99. //freopen("fliptile.out","w",stdout);
  100. scanf("%d%d",&n,&m);
  101. pos(i,1,n){
  102. pos(j,1,m){
  103. scanf("%d",&a[i][j]);
  104. }
  105. }
  106. pos(i,0,(1<<m)-1){
  107. memset(temp,0,sizeof(temp));
  108. if(work(i)){
  109. update();
  110. }
  111. else{
  112. continue;
  113. }
  114. }
  115. if(flag){
  116. pos(i,1,n){
  117. pos(j,1,m){
  118. cout<<ans[i][j]<<" ";
  119. }
  120. cout<<endl;
  121. }
  122. }
  123. else{
  124. cout<<"IMPOSSIBLE";
  125. }
  126. return 0;
  127. }

  

[Usaco2007 Open]Fliptile 翻格子游戏 状态压缩的更多相关文章

  1. 1647: [Usaco2007 Open]Fliptile 翻格子游戏

    1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 423  Solved: 173[ ...

  2. [Usaco2007 Open]Fliptile 翻格子游戏

    [Usaco2007 Open]Fliptile 翻格子游戏 题目 Farmer John knows that an intellectually satisfied cow is a happy ...

  3. [Usaco2007 Open]Fliptile 翻格子游戏题解

    问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec  内存限制: 128 MB 题目描述 Farmer John knows that an intell ...

  4. 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索

    第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...

  5. BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...

  6. 【BZOJ】1647: [Usaco2007 Open]Fliptile 翻格子游戏(暴力)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1647 自己太弱...看题解.. 竟然是枚举第一行的放法,,,因为一定要全部变0,所以将前一行1的在这 ...

  7. [Usaco2007 Open]Fliptile 翻格子游戏 状压dp

    n,m<=15,直接搞肯定不行,考虑一行一行来, 每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑 最后一行必须要同时满足他自己和他上面那行,否则舍去 #inc ...

  8. bzoj 1647: [Usaco2007 Open]Fliptile 翻格子游戏【dfs】

    这个可以用异或高斯消元,但是我不会呀我用的暴搜 2的m次方枚举第一行的翻转情况,然后后面的就定了,因为对于一个j位置,如果i-1的j位置需要翻,那么一定要翻i的j,因为这是i-1的j最后翻的机会 按字 ...

  9. Fliptile 翻格子游戏

    问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec  内存限制: 128 MB 题目描述 Farmer John knows that an intell ...

随机推荐

  1. TPYBoard自制微信远程智能温湿度计

    智能时代一夜间什么都能远程了.创业者想着如何做智能产品,如何做远程控制.DIY爱好者也想着如何自制各种奇妙的工具.这里和大家一起学习制作一款廉价的智能温湿度计.说它廉价是因为共计花费不过40元,说它智 ...

  2. 简单的视频采集demo

    打算做个简单的聊天软件,其中一个我没做过的,就是视频采集. 在网上查了许久资料,终于搞清楚了dshow采集视频的流程 参考资料如下: https://msdn.microsoft.com/en-us/ ...

  3. AngularJS模块

    方式一: <body ng-app="myApp"> <div ng-controller="myCtrl1"> <h1>{ ...

  4. php下redis的安装教程

    1.得有php的环境,推荐使用appserv,下载链接 链接: http://pan.baidu.com/s/1cHqSOY 密码: b8w2 2.安装redis 下载链接 链接: http://pa ...

  5. android studio 怎么将项目打包成apk文件

    1.Build -> Generate Signed APK...,打开如下窗口 2.假设这里没有打过apk包,点击Create new,窗口如下 这里只要输入几个必要项 Key store p ...

  6. html标签及用法小结

    html标签小结 这几天学习了html,才发现各种标签真是多的不行,所以打算把一些个常用的标签拿出来稍微说一下. *** 常用基础标签 大体上分了三类: 带有语义的标签 带有一定样式的标签(此类标签页 ...

  7. Android远程桌面助手

    很早之前,做过一个<WinCE远程桌面助手>,在没有屏幕或者在调试LCD驱动时,发挥了很大作用,平日开发也是必备.后来还被网友用于处理一些疑难问题,如无法输入开机密码时可通过该工具远程输入 ...

  8. [图形学] Chp10 OpenGL三维观察程序示例

    10.10节书中给出了一个程序示例,有一个填充正方形,从侧面的角度观察并画到屏幕上. 图0 这里进一步画出一个立方体,将相机放入立方体中心,旋转相机,达到在立方体中旋转看到不同画面的效果. 步骤: 1 ...

  9. JSON.parse()与JSON.stringify()的区别

    JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"name":"goatling"}' //解析 ...

  10. Windows 10 上,Edge 浏览器不支持插件,因此将不运行 Java

    在 Windows 10 上,Edge 浏览器不支持插件,因此将不运行 Java.微软想干嘛?