题目传送门

题意:有n*m的房间,'.'表示可以被点亮,'#'表示不能被点亮,每点亮一个房间会使旁边的房间也点亮,有意盏特别的灯可以选择周围不同方向的房间点亮。问最少需要多少灯使得所有房间点亮

分析:需要被点亮的房间最多只有15个,所以考虑状压,然后暴力枚举选择哪一个当作特殊灯和枚举选择哪个方向使旁边的房间亮,注意清空vis数组需要优化,memset超时。上交6分钟1Y,Orz。。。额,看错榜了,最快的19分钟,而且这不是第一道水题,汗

  1. /************************************************
  2. * Author :Running_Time
  3. * Created Time :2015/10/22 星期四 18:25:25
  4. * File Name :A.cpp
  5. ************************************************/
  6.  
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <iostream>
  10. #include <sstream>
  11. #include <cstring>
  12. #include <cmath>
  13. #include <string>
  14. #include <vector>
  15. #include <queue>
  16. #include <deque>
  17. #include <stack>
  18. #include <list>
  19. #include <map>
  20. #include <set>
  21. #include <bitset>
  22. #include <cstdlib>
  23. #include <ctime>
  24. using namespace std;
  25.  
  26. #define lson l, mid, rt << 1
  27. #define rson mid + 1, r, rt << 1 | 1
  28. typedef long long ll;
  29. const int N = 2e2 + 10;
  30. const int INF = 0x3f3f3f3f;
  31. const int MOD = 1e9 + 7;
  32. const double EPS = 1e-8;
  33. char room[N][N];
  34. struct Point {
  35. int x, y;
  36. Point (int x, int y) : x (x), y (y) {}
  37. };
  38. int n, m;
  39. bool vis[N][N];
  40.  
  41. void back_nomal(int x, int y) {
  42. vis[x][y] = false;
  43. if (x - 1 >= 1) vis[x-1][y] = false;
  44. if (y + 1 <= m) vis[x][y+1] = false;
  45. }
  46.  
  47. void back_special(int x, int y, int type) {
  48. if (type == 1) {
  49. back_nomal (x, y); return ;
  50. }
  51. else if (type == 2) {
  52. if (x + 1 <= n) {
  53. vis[x+1][y] = false;
  54. }
  55. if (y + 1 <= m) {
  56. vis[x][y+1] = false;
  57. }
  58. }
  59. else if (type == 3) {
  60. if (x + 1 <= n) {
  61. vis[x+1][y] = false;
  62. }
  63. if (y - 1 >= 1) {
  64. vis[x][y-1] = false;
  65. }
  66. }
  67. else if (type == 4) {
  68. if (x - 1 >= 1) {
  69. vis[x-1][y] = false;
  70. }
  71. if (y - 1 >= 1) {
  72. vis[x][y-1] = false;
  73. }
  74. }
  75. vis[x][y] = false;
  76. }
  77.  
  78. bool light_nomal(int x, int y) {
  79. if (x - 1 >= 1 && room[x-1][y] != '.') return false;
  80. if (y + 1 <= m && room[x][y+1] != '.') return false;
  81. if (x - 1 >= 1) {
  82. vis[x-1][y] = true;
  83. }
  84. if (y + 1 <= m) {
  85. vis[x][y+1] = true;
  86. }
  87. vis[x][y] = true;
  88. return true;
  89. }
  90.  
  91. bool light_special(int x, int y, int type) {
  92. if (type == 1) {
  93. return light_nomal (x, y);
  94. }
  95. else if (type == 2) {
  96. if (x + 1 <= n && room[x+1][y] != '.') return false;
  97. if (y + 1 <= m && room[x][y+1] != '.') return false;
  98. if (x + 1 <= n) {
  99. vis[x+1][y] = true;
  100. }
  101. if (y + 1 <= m) {
  102. vis[x][y+1] = true;
  103. }
  104. }
  105. else if (type == 3) {
  106. if (x + 1 <= n && room[x+1][y] != '.') return false;
  107. if (y - 1 >= 1 && room[x][y-1] != '.') return false;
  108. if (x + 1 <= n) {
  109. vis[x+1][y] = true;
  110. }
  111. if (y - 1 >= 1) {
  112. vis[x][y-1] = true;
  113. }
  114. }
  115. else if (type == 4) {
  116. if (x - 1 >= 1 && room[x-1][y] != '.') return false;
  117. if (y - 1 >= 1 && room[x][y-1] != '.') return false;
  118. if (x - 1 >= 1) {
  119. vis[x-1][y] = true;
  120. }
  121. if (y - 1 >= 1) {
  122. vis[x][y-1] = true;
  123. }
  124. }
  125. vis[x][y] = true;
  126. return true;
  127. }
  128.  
  129. int main(void) {
  130. while (scanf ("%d%d", &n, &m) == 2) {
  131. if (!n && !m) break;
  132. for (int i=1; i<=n; ++i) {
  133. scanf ("%s", room[i] + 1);
  134. }
  135. int cnt = 0;
  136. memset (vis, false, sizeof (vis));
  137. vector<Point> V;
  138. for (int i=1; i<=n; ++i) {
  139. for (int j=1; j<=m; ++j) {
  140. if (room[i][j] == '.') {
  141. cnt++;
  142. V.push_back (Point (i, j));
  143. }
  144. }
  145. }
  146. if (cnt == 0) {
  147. puts ("0"); continue;
  148. }
  149. int tot = 1 << cnt;
  150. int ans = INF;
  151. for (int i=0; i<tot; ++i) {
  152. for (int k=0; k<cnt; ++k) {
  153. for (int l=1; l<=4; ++l) {
  154. bool ok = true;
  155. for (int j=0; j<cnt; ++j) {
  156. if (i & (1 << j)) {
  157. if (j == k) {
  158. if (!light_special (V[j].x, V[j].y, l)) {
  159. ok = false; break;
  160. }
  161. }
  162. else {
  163. if (!light_nomal (V[j].x, V[j].y)) {
  164. ok = false; break;
  165. }
  166. }
  167. }
  168. }
  169. if (!ok) {
  170. for (int j=0; j<cnt; ++j) {
  171. if (j == k) back_special (V[j].x, V[j].y, l);
  172. else back_nomal (V[j].x, V[j].y);
  173. }
  174. continue;
  175. }
  176. bool flag = true;
  177. for (int j=0; j<cnt; ++j) {
  178. int x = V[j].x, y = V[j].y;
  179. if (!vis[x][y]) {
  180. flag = false; break;
  181. }
  182. }
  183. if (flag) {
  184. ans = min (ans, __builtin_popcount (i));
  185. }
  186. for (int j=0; j<cnt; ++j) {
  187. if (j == k) back_special (V[j].x, V[j].y, l);
  188. else back_nomal (V[j].x, V[j].y);
  189. }
  190. }
  191. }
  192. }
  193. printf ("%d\n", ans == INF ? -1 : ans);
  194. }
  195.  
  196. return 0;
  197. }

  

状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely的更多相关文章

  1. HDOJ 4770 Lights Against Dudely

    状压+暴力搜索 Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  2. hdu 4770 Lights Against Dudely(回溯)

    pid=4770" target="_blank" style="">题目链接:hdu 4770 Lights Against Dudely 题 ...

  3. HDU 4770 Lights Against Dudely 暴力枚举+dfs

    又一发吐血ac,,,再次明白了用函数(代码重用)和思路清晰的重要性. 11779687 2014-10-02 20:57:53 Accepted 4770 0MS 496K 2976 B G++ cz ...

  4. HDU 4770 Lights Against Dudely (2013杭州赛区1001题,暴力枚举)

    Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. HDU 4770 Lights Against Dudely

    Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. HDU 4770 Lights Against Dudely(暴力+状压)

    思路: 这个题完全就是暴力的,就是代码长了一点. 用到了状压,因为之前不知道状压是个东西,大佬们天天说,可是我又没学过,所以对状压有一点阴影,不过这题中的状压还是蛮简单的. 枚举所有情况,取开灯数最少 ...

  7. POJ 1753 Flip Game 状态压缩,暴力 难度:1

    Flip Game Time Limit: 1000MS  Memory Limit: 65536K  Total Submissions: 4863  Accepted: 1983 Descript ...

  8. HDU_4770 Lights Against Dudely 状压+剪枝

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4770 Lights Against Dudely Time Limit: 2000/1000 MS ( ...

  9. hdu 2489 最小生成树状态压缩枚举

    思路: 直接状态压缩暴力枚举 #include<iostream> #include<algorithm> #include<cstdio> #include< ...

随机推荐

  1. 注意页面上的时间戳可能会成为bd快照的时间_快照不更新的原因

    之前在创建内容的时候,为了提高说服力,添加了一个原始文章的地址**.com.cn/2013-08/22/content_**.htm,当时写文章是在12月份,单快照直接变成原始文章的时间戳8.22

  2. 机器学习公开课笔记(3):Logistic回归

    Logistic 回归 通常是二元分类器(也可以用于多元分类),例如以下的分类问题 Email: spam / not spam Tumor: Malignant / benign 假设 (Hypot ...

  3. 修改php.ini以达到 屏蔽错误信息

    那是因为php.ini中关闭了错误显示,将错误写成了文件,这是人为设置的结果,display_errors =on就好了. 不过不显示错误倒安全点,建议调试时打开,然后提供服务时关闭. 提供一点资料给 ...

  4. shell kill掉含同一字符的关键字的进程

    如何kill掉进程名包含某个字符串的一批进程:kill -9 $(ps -ef|grep 进程名关键字|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ') 观 ...

  5. java中堆栈(stack)和堆(heap)

    原文地址:http://blog.csdn.net/jerryao/article/details/874101 1.内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈 ...

  6. C#父类子类对象关系

    案例: 主要有Vehicle.cs  Airplane.cs   Car.cs  3个类. Car和Airplane都继承与Vehicle类.Vehicle中Drive为虚方法,可在子类中重写,父类引 ...

  7. HTML 笔记,持续更新

    一.文本格式化标签 <b> 定义粗体文本. <big> 定义大号字. <em> 定义着重文字. <i> 定义斜体字. <small> 定义小 ...

  8. 【转】android中Uri.parse()用法

    1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTI ...

  9. MVC ViewBag和ViewData的区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

  10. Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...