思路:

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

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

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

解释都在注释之中了。

#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. Bootstrap之图片展示界面Demo

    代码:(使用模板引擎freemarker) <!DOCTYPE html> <html> <head> <title>图片</title> ...

  2. Java 学习(1) ---JDK安装和配置环境变量

    一,Java 开发的第一步,就是安装JDK(Java Development ToolKit  Java开发工具包) JDK 是Java开发的核心,因为它包括Java 运行环境,工具包和命令.当我们安 ...

  3. Vue获取dom和数据监听

    Vue获取dom对象 在js和jq中我们都能获取dom对象例如 // 获取id=1的div标签 <div id=d1>dom对象</div> // js语法 let ele = ...

  4. Sql Server设置主键和外键

    设置主键 https://jingyan.baidu.com/article/9158e0003349a7a2541228fd.html 设置外键 https://jingyan.baidu.com/ ...

  5. Github提交本地代码

     第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令 git init 第二步:将项目的所有文件添加到仓库中 git add . 如果想添加某个特定的文件,只需把.换成特定的文件名即可 ...

  6. 微信小程序——使用vue构建小程序【外传】

    文档 http://mpvue.com/mpvue/ 根据文档构建完成的页面如下 更多的,还要继续看下文档~

  7. LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】

    题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...

  8. Minimum number of steps CodeForces - 805D(签到题)

    D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...

  9. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  10. github Permission denied (publickey). fatal: Could not read from remote repository.

    github Permission denied (publickey).fatal: Could not read from remote repository. ----------------- ...