题目链接

题意 : 给你一个矩阵,有黑有白,翻转一个块可以让上下左右都翻转过来,问最少翻转多少次能让矩阵变为全白。

思路 : 我们从第一行开始枚举要翻转的状态,最多可以枚举到2的16次方,因为你只要第一行的确定了,第二行要翻转的也就确定了,所以第一行的状态决定了最后的状态。看了网上大神,真是让位运算废了啊,,,,,太复杂了。。。。。。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <map>
  5.  
  6. using namespace std;
  7.  
  8. const int INF = ;
  9. int r,c,n;
  10. int data[] ;
  11.  
  12. void Init()
  13. {
  14. char mapp[][] ;
  15. memset(data,,sizeof(data)) ;
  16. if(r >= c)
  17. {
  18. for(int i = ; i < r ; i++)//每一行都用一个二进制数来保存
  19. {
  20. data[i] = ;
  21. scanf("%s",mapp[i]) ;
  22. for(int j = ; j < c ; j++)
  23. {
  24. if(mapp[i][j] == 'X')
  25. data[i] |= << j ;//这一行中将是X的地方全部存为1
  26. }
  27. }
  28. }
  29. else//优化,当列比较少的时候就翻转过来用列。
  30. {
  31. for(int i = ; i < r ; i++)
  32. {
  33. data[i] = ;
  34. scanf("%s",mapp[i]) ;
  35. for(int j = ; j < c ; j++)
  36. if(mapp[i][j] == 'X')
  37. data[j] |= << i ;
  38. }
  39. //把r和c的两值互换
  40. r = r^c ;
  41. c = r^c ;
  42. r = r^c ;
  43. }
  44. }
  45. void solve()
  46. {
  47. int minn = INF ;
  48. int a[],tmp[] ;
  49. for(int i = ; i < ( << c) ; i++)//枚举状态,共有2的c次方个
  50. {
  51. for(int j = ; j < r ; j++)
  52. a[j] = data[j] ;
  53. for(int j = ; j < r ; j++)
  54. {
  55. tmp[j] = j == ? i : a[j-] ;
  56. a[j] ^= tmp[j] ;//本行要翻转
  57. a[j] ^= tmp[j] >> ;//右边也要翻转
  58. a[j] ^= tmp[j] << & (( << c)-) ;//防止最左边的那位超出范围
  59. a[j+] ^= tmp[j] ;//下一行也要翻转
  60. }
  61. if(!a[r-])//因为第一行确定之后第二行也就确定了,以此类推,只要判断最后一行是不是全白就行了
  62. {
  63. int cnt = ;
  64. for(int j = ; j < r ; j++)
  65. {
  66. for(int k = tmp[j] ; k > ; k >>= )
  67. if( & k) cnt ++ ;
  68. }
  69. if(cnt < minn) minn = cnt ;
  70. }
  71. }
  72. if(minn == INF)
  73. printf("Damaged billboard.\n") ;
  74. else printf("You have to tap %d tiles.\n",minn) ;
  75. }
  76. int main()
  77. {
  78. while(~scanf("%d %d",&r,&c))
  79. {
  80. if(r == && c == )
  81. break ;
  82. Init() ;
  83. solve() ;
  84. }
  85. return ;
  86. }

如果那四行看不懂,没关系,因为我也看不太懂,看这里应该比较好理解一点,就是翻本行,翻左边那一列,右边那一列,下一行

HDU 1882 Strange Billboard(位运算)的更多相关文章

  1. hdu 1882 Strange Billboard(位运算+枚举)

    http://acm.hdu.edu.cn/showproblem.php?pid=1882 感觉非常不错的一道题. 给一个n*m(1<=n,m<=16)的矩阵,每一个格子都有黑白两面,当 ...

  2. HDU 1882 Strange Billboard(状态压缩+转置优化)

    状态压缩,我们枚举第一行的所有状态,然后根据第一行去转变下面的行,枚举或者深搜直到最后最后一行,可以判断是不是所有的1都可以全部转换为0,记录所有的解,输出最小的一个就可以. 这里有一个很重要的优化, ...

  3. hdu 5023 线段树+位运算

    主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...

  4. HDU 5491 The Next(位运算)

    题意:已知D(0<=D<2^31).s1.s2,其中L为D转化为二进制数时1的个数,题目保证s1<=L<=s2,求一个数,满足以下条件: 1.比D大 2.转化为二进制时1的个数 ...

  5. [HDU] 3711 Binary Number [位运算]

    Binary Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  6. HDU - 6186 前缀和位运算

    异或操作蒙蔽了我的双眼 以至于没有第一时间想到前缀和与后缀和 水题做的不够多 #include<bits/stdc++.h> #define rep(i,j,k) for(register ...

  7. HDU 3006 The Number of set(位运算 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...

  8. hdu 4739【位运算】.cpp

    题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...

  9. HDU 1074 Doing Homework (动态规划,位运算)

    HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...

随机推荐

  1. 【风马一族_git_github】git的工作流程

    git有三个区域(如图): 基本信息设置 1)设置用户名   git config --global user.name  "帐号名" 2)设置用户名邮箱  git config ...

  2. <解说linux下proc文件系统>

    proc文件系统的作用是访问系统内核信息 proc不是一个真实的文件系统,它不占系统的外存空间,只是以文件的形式为用户访问linux内核数据提供接口,因为系统内核总是动态的变化,所以我们所捕捉到的也只 ...

  3. nginx自启动脚本

    #!/bin/bash # #Startup script for Nginx - this script starts and stops the nginx daemon # # chkconfi ...

  4. php数组声明、遍历、数组全局变量使用小结

    数组的本质:管理和操作一组变量,成批处理,下面为大家介绍下数组的分类.数组的分类及使用说明,感兴趣的朋友可以了解下哈   php教程:数组声明,遍历,数组全局变量  <? /* * 一.数组的概 ...

  5. HTML5特性:使用async属性异步加载执行JavaScript

    HTML5让我兴奋的一个最大的原因是,它里面实现的新功能和新特征都是我们长久以来一直期待的.比如,我以前一直在使用placeholders,但以前必须要用JavaScript实现.而HTML5里给Ja ...

  6. 在有跳板机的情况下,SecureCRT自动连接到目标服务器

    为了服务器的安全,运维人员经常会要求我们先登录到跳板机,然后再SSH连接到目标服务器.但是这样是很繁琐的,每次在SecureCRT创建一个连接,都需要输入SSH命令,然后输入密码. 下面的方法可以实现 ...

  7. 【笔记】WPF之模板控件应用

    最近在捣鼓WPF的动画,想自定义一个控件模型来实现动画. 目标功能是这样:在WPF项目文件中创建一个自定义用户控件模型,该模型最外层是一个Grid,Grid布局为3行1列,第一列是一个图片按钮,第二列 ...

  8. 提高Linux上socket性能

    在 开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求.利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序.本文内容包括对于 Soc ...

  9. 十二、BOOL冒泡

    int main(){        int a[5] = {5,2,3,4,1};      //需要一个可以告诉我们没有交换的东西      //YES:交换      //NO:未交换     ...

  10. clion windows 开发配置

    1.下载clion 并且安装. 地址 : http://download-cf.jetbrains.com/cpp/clion-1.0.1.exe 2.安装cygwin  地址: https://cy ...