思路:

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

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

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

解释都在注释之中了。

#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. jquery和js的几种页面加载函数的方法以及执行顺序

    参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html    https://www.cnblogs.com/james641/p/783837 ...

  2. DBExpress动态连接SQL-Server

    procedure TForm1.Button1Click(Sender: TObject);var  theCNN : TSQLConnection;//定义连接,要引用 DB, SqlExprbe ...

  3. MySQL in型子查询陷阱

    现在有两个表,table1和table2,table1有1千万数据(id 主键索引),table2有三条数据(uid字段 3,5,7): select * from table1 where id i ...

  4. vue axios 封装(二)

    封装二: http.js import axios from 'axios' import storeHelper from './localstorageHelper' // 全局设置 const ...

  5. 12.k8s的存储卷创建过程

    数据持久化需要数据卷.kubernetes生态提供海量的存储驱动和存储使用方式. [root@master song]# cat pod-demo.yml apiVersion: v1 kind: P ...

  6. CSS3 flexbox 布局 ---- flex 容器属性介绍

    flexbox布局是CSS3中新增的属性,它可以很轻松地帮我们解决掉一些常见的布局问题,比如导航栏. 我们用普通的方法写导航栏,通常会在ul, li 结构写好后,让li 元素左浮动,然后再给ul 清浮 ...

  7. Spring 使用介绍(十)—— 单元测试

    一.概述 Spring测试框架提供了对单元测试的支持,以便使用spring的依赖注入和事务管理功能 maven依赖: <dependency> <groupId>junit&l ...

  8. LVS负载均衡群集

    概述 群集的类型:无论是哪种服务器,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机.根据群集所针对的目标差异,可以分为以下三个类型: 1.负 ...

  9. Edge Deletion CodeForces - 1076D(水最短路)

    题意: 设从1到每个点的最短距离为d,求删除几条边后仍然使1到每个点的距离为d,使得剩下的边最多为k 解析: 先求来一遍spfa,然后bfs遍历每条路,如果d[v] == d[u] + Node[i] ...

  10. mongoDB 命令整理

    库操作 创建数据库 use [database] 查看数据库 show dbs 删除 db.dropDatabase() 备份 mongodump -h[host] ip -d[databasenam ...