思路:

这个题完全就是暴力的,就是代码长了一点。

用到了状压,因为之前不知道状压是个东西,大佬们天天说,可是我又没学过,所以对状压有一点阴影,不过这题中的状压还是蛮简单的。

枚举所有情况,取开灯数最少的。

解释都在注释之中了。

#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#define fuck(x) cout<<#x<<" = "<<x<<endl;
#define ls (t<<1)
#define rs ((t<<1)+1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = ;
const int inf = 2.1e9;
const ll Inf = ;
const int mod = 1e9+;
const double eps = 1e-; char mp[maxn][maxn];
int vis[maxn][maxn];
struct node
{
int x;
int y;
};
vector<node>u;
int get_num(int x)
{
int ans = ;
while(x){
if(x&){ans++;}
x>>=;
}
return ans;
} int n,m; int turn1(int t,int ans)
{
int x=u[t].x,y=u[t].y;
if(mp[x-][y]=='.'&&vis[x-][y]==){ans++;}
if(mp[x+][y]=='.'&&vis[x+][y]==){ans--;}
if(mp[x][y+]=='#'){return ;}
if(mp[x+][y]=='#'){return ;}
return ans;
} int turn2(int t,int ans)
{
int x=u[t].x,y=u[t].y;
if(mp[x-][y]=='.'&&vis[x-][y]==){ans++;}
if(mp[x][y+]=='.'&&vis[x][y+]==){ans++;}
if(mp[x+][y]=='.'&&vis[x+][y]==){ans--;}
if(mp[x+][y]=='#'){return ;}
if(mp[x][y-]=='.'&&vis[x][y-]==){ans--;}
if(mp[x][y-]=='#'){return ;}
return ans;
} int turn3(int t,int ans)
{
int x=u[t].x,y=u[t].y;
if(mp[x][y+]=='.'&&vis[x][y+]==){ans++;}
if(mp[x][y-]=='.'&&vis[x][y-]==){ans--;}
if(mp[x-][y]=='#'){return ;}
if(mp[x][y-]=='#'){return ;}
return ans;
} //判断状态是否可行
bool light(int x)
{
memset(vis,,sizeof(vis));
int k=u.size();
int kk[];//kk记录有几盏灯是亮的
for(int i=;i<k;i++){
if(x&){kk[i]=;}
else{kk[i]=;}
x>>=;
}
int y;
int error=,e;//error表示有几盏灯在没有旋转的情况下,照亮了不可照亮区域
for(int i=;i<k;i++){
if(kk[i]){
x=u[i].x;y=u[i].y;
if(mp[x-][y]=='#'||mp[x][y+]=='#'){error++;e=i;}
//vis记录某房间被照亮的次数
vis[x-][y]++;vis[x][y+]++;
vis[x][y]++;
}
}
if(error>){return false;}
int num=;//num记录有几个区域,应该被照亮而没有被照亮。 for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mp[i][j]=='.'&&!vis[i][j]){num++;}
if(mp[i][j]=='#'&&vis[i][j]>){return false;}
}
}
if(num>){return false;}
//tt是num的中间结果
int tt;
if(error){
//turn 表示旋转,返回值其实是旋转之后满不满足题意
tt=turn1(e,num);if(tt==){return true;}
tt=turn2(e,num);if(tt==){return true;}
tt=turn3(e,num);if(tt==){return true;}
return false;
}
if(num==){return true;}
for(int i=;i<k;i++){
if(kk[i]){
tt=turn1(i,num);if(tt==){return true;}
tt=turn2(i,num);if(tt==){return true;}
tt=turn3(i,num);if(tt==){return true;}
}
}
return false;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&(n!=&&m!=)){
memset(mp,,sizeof(mp));
for(int i=;i<=n;i++){
scanf("%s",mp[i]+);
}
memset(vis,,sizeof(vis));
u.clear();
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mp[i][j]=='.'){
u.push_back(node{i,j});
}
}
}
int siz = u.size();
int k=(<<siz);
int num;
int ans = inf;
for(int i=;i<k;i++){
num=get_num(i);
if(num>=ans){continue;}
if(light(i))ans=min(ans,num);
}
if(ans==inf){ans=-;}
printf("%d\n",ans);
} return ;
}

HDU 4770 Lights Against Dudely(暴力+状压)的更多相关文章

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

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

  2. hdu 4770 Lights Against Dudely(回溯)

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

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

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

  4. HDU 4770 Lights Against Dudely

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

  5. 状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely

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

  6. HDOJ 4770 Lights Against Dudely

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

  7. HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)

    题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...

  8. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  9. HDU 4026 Unlock the Cell Phone 状压dp(类似TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4026 Unlock the Cell Phone Time Limit: 6000/3000 MS ...

随机推荐

  1. powerdesigner 16.5 不允许有扩展属性,或对象不存在

    创建完之后这边会出现 选择刚创建的用户 这样就可以了

  2. xml-dtd

    dtd用于校验XML的语法. dtd步骤: 1.看XML中有多少个元素,有几个元素,在dtd文件中写几个<!ELEMENT> 2.判断元素是简单元素还是复杂元素 -复杂元素:有子元素的元素 ...

  3. How to install rime on Debian

    apt-get install ibus ibus-rime librime-data-wubi reboot cp ~/.config/ibus/rime/default.yaml ~/.confi ...

  4. cookie中的小错误

    今天在练习 cookie时意外的报了这个错. 这句话的意思是一个不识别的字符[32]出现在了cookie当中由于tomcat的版本比较高,所以在addCookie时是不能使用空格的 而在ASCII码中 ...

  5. codeforces659C

    Tanya and Toys CodeForces - 659C In Berland recently a new collection of toys went on sale. This col ...

  6. hdu-2328(暴力枚举+kmp)

    题意:给你n个字符串,问你这n个串的最长公共子串 解题思路:暴力枚举任意一个字符串的所有子串,然后暴力匹配,和hdu1238差不多的思路吧,这里用string解决的: 代码: #include< ...

  7. 数据库中事务的四大特性(ACID)

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  8. 前端nginx+Java后台ftp处理页面图片上传踩坑

    今天,将前端代码部署到服务器nginx上,在测试多图片上传时,报错413请求体空间太大,请求都没到后台,直接被nginx拦截,调整后又报错504. 整体而言,前端存在两处问题: 413 错误 :Req ...

  9. 浅析Android设备中grep命令处理流程

    2017-04-18   概述     在TV开发板中,可以在串口中直接使用grep命令.这是因为在/system/bin/下有一个'grep'链接.这个链接指向'/system/bin/toolbo ...

  10. html概念

    一.前端 1.什么是前端 前端即网站前台部分,运行在PC端等浏览器上展现给用户浏览的网页.随着互联网技术的发展, HTML5,CSS3,前端框架的应用,跨平台响应式网页设计能够适应各种屏幕分辨率,完美 ...