思路:

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

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

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

解释都在注释之中了。

#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. mysql “Too many connections” 解决办法

    今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”.平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后重启 ...

  2. MySQL——基础操作

    参考博客:http://www.cnblogs.com/wupeiqi/articles/5713315.html 1.创建用户.授权(默认root,密码为空) 创建: create user 'al ...

  3. Nginx 如何处理上游响应的数据

    陶辉93 一个非常重要的指令 proxy_buffer_size 指令限制头部响应header最大值 proxy_buffering 指令主要是指 上游服务器是否接受完完整包体在处理 默认是on 也就 ...

  4. Promise实现队列

    有时候我不希望所有动作一起发生,而是按照一定顺序,逐个进行 var promise=doSomething(); promise=promise.then(doSomethingElse); prom ...

  5. HTC Vive 基础入门 基于Unreal Engine 4引擎

    主要以讲解介绍HTC Vive设备以及Unreal继承的Steam VR Plugin为主 使用最新的虚幻引擎与Plugin完成VR环境的搭建 然后完成一个基本的VR Games. 任务5: 04-配 ...

  6. 在GitHub上读大学:涵盖清华,北大,浙大等大学课程

    来自多位GitHub网友在GitHub分享的几组学习课程项目, 学习课程包含清华,北大,浙大,中科大,上海交大, 等中国多所名校的英语,AI高数,人工智能等课程以及一些讲义考题. 如果你想了解这些大学 ...

  7. Codeforces Round #432 Div. 1

    A:大胆猜想合法点不会很多,于是暴力检验,一旦发现不合法就break,可以random_shuffle一下. #include<iostream> #include<cstdio&g ...

  8. 【XSY2785】模型

    题目描述 给你一棵\(n\)个点的树,让你加最少的边,使得图中没有割点. 要求输出方案. \(n\leq 500000\) 题解 把叶子的权值设为\(1\),其他点设为\(0\),找出带权重心. 以重 ...

  9. python学习日记(join,range)

    join方法 join方法用于将序列里的字符串以指定的字符串连接成一个新的字符串 s = 'fasfw123' s1 = '-'.join(s) print(s1) str = '&ooooo ...

  10. AGC030 简要题解

    A - Poisonous Cookies 题意 有\(A\)个能解毒的普通饼干,\(B\)个能解毒的美味饼干,\(C\)个有毒的美味饼干,求最多能吃多少个美味饼干,每次吃完有毒的饼干后要解毒后才能继 ...