思路:

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

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

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

解释都在注释之中了。

#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. Mybatis之collection嵌套查询mapper文件写法

    mapper.xml写法举例 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper ...

  2. Cherry.chen window.clipboardData实现剪切板操作总结 (好像只有ie好用)

    window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上,提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用. 三个方法 (1)clearData(sDataForma ...

  3. 学习 Spring (十七) Spring 对 AspectJ 的支持 (完结)

    Spring入门篇 学习笔记 @AspectJ 的风格类似纯 java 注解的普通 java 类 Spring 可以使用 AspectJ 来做切入点解析 AOP 的运行时仍旧是纯的 Spring AO ...

  4. Overrid Equals Defined Operator

    public class Common { public override int GetHashCode() { return base.GetHashCode(); } public overri ...

  5. 【建模应用】PCA主成分分析原理详解

    原文载于此:http://blog.csdn.net/zhongkelee/article/details/44064401 一.PCA简介 1. 相关背景 上完陈恩红老师的<机器学习与知识发现 ...

  6. eclipse中无法查看引用的jar包源码

    本文来源:http://blog.csdn.NET/zljjava/article/details/7545270(这篇博客也是转载的,向最原始的作者致敬) 1.下载JAD jad官方地址的官方下载地 ...

  7. Vue——服务器上部署vue.js

    服务器版本 [root@izuf63g0jydq42k49eo7zcz ~]# uname -a Linux izuf63g0jydq42k49eo7zcz -.el7.x86_64 # SMP Tu ...

  8. springcloud 学习

    参考: spring cloud 入门系列一:初识spring cloud http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95 ...

  9. springboot 简单搭建

    springboot的入门请参考:https://blog.csdn.net/hanjun0612/article/details/81538449 这里就简单看下搭建: 一,看一下项目结构: 创建一 ...

  10. Json.net 反序列化 部分对象

    主要通过 Jobject获取想要序列化的部分对象. 直接上代码 static void Main(string[] args) { //先反序列化看看 string json = "{\&q ...