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

 

题目传送门

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

分析:需要被点亮的房间最多只有15个,所以考虑状压,然后暴力枚举选择哪一个当作特殊灯和枚举选择哪个方向使旁边的房间亮,注意清空vis数组需要优化,memset超时。上交6分钟1Y,Orz。。。额,看错榜了,最快的19分钟,而且这不是第一道水题,汗

 

/************************************************* Author        :Running_Time* Created Time  :2015/10/22 星期四 18:25:25* File Name     :A.cpp************************************************/#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 2e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
char room[N][N];
struct Point    {int x, y;Point (int x, int y) : x (x), y (y) {}
};
int n, m;
bool vis[N][N];void back_nomal(int x, int y)   {vis[x][y] = false;if (x - 1 >= 1) vis[x-1][y] = false;if (y + 1 <= m) vis[x][y+1] = false;
}void back_special(int x, int y, int type) {if (type == 1)  {back_nomal (x, y);  return ;}else if (type == 2)  {if (x + 1 <= n) {vis[x+1][y] = false;}if (y + 1 <= m) {vis[x][y+1] = false;}}else if (type == 3) {if (x + 1 <= n) {vis[x+1][y] = false;}if (y - 1 >= 1) {vis[x][y-1] = false;}}else if (type == 4) {if (x - 1 >= 1) {vis[x-1][y] = false;}if (y - 1 >= 1) {vis[x][y-1] = false;}}vis[x][y] = false;
}bool light_nomal(int x, int y)  {if (x - 1 >= 1 && room[x-1][y] != '.')  return false;if (y + 1 <= m && room[x][y+1] != '.')  return false;if (x - 1 >= 1) {vis[x-1][y] = true;}if (y + 1 <= m) {vis[x][y+1] = true;}vis[x][y] = true;return true;
}bool light_special(int x, int y, int type)    {if (type == 1)  {return light_nomal (x, y);}else if (type == 2)  {if (x + 1 <= n && room[x+1][y] != '.')  return false;if (y + 1 <= m && room[x][y+1] != '.')  return false;if (x + 1 <= n) {vis[x+1][y] = true;}if (y + 1 <= m) {vis[x][y+1] = true;}}else if (type == 3) {if (x + 1 <= n && room[x+1][y] != '.')  return false;if (y - 1 >= 1 && room[x][y-1] != '.')  return false;if (x + 1 <= n) {vis[x+1][y] = true;}if (y - 1 >= 1) {vis[x][y-1] = true;}}else if (type == 4) {if (x - 1 >= 1 && room[x-1][y] != '.')  return false;if (y - 1 >= 1 && room[x][y-1] != '.')  return false;if (x - 1 >= 1) {vis[x-1][y] = true;}if (y - 1 >= 1) {vis[x][y-1] = true;}}vis[x][y] = true;return true;
}int main(void)    {while (scanf ("%d%d", &n, &m) == 2) {if (!n && !m)   break;for (int i=1; i<=n; ++i)    {scanf ("%s", room[i] + 1);}int cnt = 0;memset (vis, false, sizeof (vis));vector<Point> V;for (int i=1; i<=n; ++i)    {for (int j=1; j<=m; ++j)    {if (room[i][j] == '.')  {cnt++;V.push_back (Point (i, j));}}}if (cnt == 0)   {puts ("0"); continue;}int tot = 1 << cnt;int ans = INF;for (int i=0; i<tot; ++i) {for (int k=0; k<cnt; ++k)   {for (int l=1; l<=4; ++l)    {bool ok = true;for (int j=0; j<cnt; ++j)   {if (i & (1 << j))   {if (j == k) {if (!light_special (V[j].x, V[j].y, l))    {ok = false; break;}}else    {if (!light_nomal (V[j].x, V[j].y))  {ok = false; break;}}}}if (!ok)    {for (int j=0; j<cnt; ++j)   {if (j == k) back_special (V[j].x, V[j].y, l);else    back_nomal (V[j].x, V[j].y);}continue;}bool flag = true;for (int j=0; j<cnt; ++j)   {int x = V[j].x, y = V[j].y;if (!vis[x][y]) {flag = false;   break;}}if (flag)   {ans = min (ans, __builtin_popcount (i));}for (int j=0; j<cnt; ++j)   {if (j == k) back_special (V[j].x, V[j].y, l);else    back_nomal (V[j].x, V[j].y);}}}}printf ("%d\n", ans == INF ? -1 : ans);}return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4902677.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有什么看起来很难,但是其实很简单的题目

全世界只有3.14 % 的人关注了爆炸吧知识做题其实很简单今天超模君一进办公室就感觉充满“杀气”&#xff0c;果不其然&#xff0c;一抬头就看见小天拿着一张纸对着我坏笑。莫非这家伙又要我折纸&#xff1f;拿过纸张一看&#xff0c;虽然密密麻麻的一大堆公式&#xff0c;但我相…

iphone-common-codes-ccteam源代码 CCTestMacros.m

// // CCTestMacros.m // CCFC // // Created by xichen on 11-12-30. // Copyright 2011 ccteam. All rights reserved. // #import "CCTestMacros.h" implementation CCTestMacros end 可能有更新: googlecode链接地址&#xff1a;http://code.googl…

双11,2分钟狂挣20亿的神秘大厂,急招.NET!

双11小米开门红&#xff0c;2分钟不到突破20亿&#xff0c;于是机智的我又去逛了下小米的招聘官网&#xff1a;招5年左右.NET&#xff0c;35k左右&#xff0c;14薪&#xff0c;要求WPF和自动化&#xff0c;真香&#xff01;回首牛年2个跳槽季&#xff0c;招WPF的大厂太多了&…

炸了!刚刚数学家获得了2020年诺贝尔物理学奖!没想到诺奖也能蝉联.......

全世界只有3.14 % 的人关注了爆炸吧知识就在刚刚&#xff0c;万众瞩目的2020年诺贝尔奖物理学奖获得者确定了&#xff01;他们就是——天体物理学家&#xff08;该领域连续两年获得诺奖&#xff09;物理学奖得主罗格彭罗斯爵士&#xff08;Roger penrose&#xff09;&#xff0…

Perl深拷贝

使用mkdir可以创建一个目录&#xff0c;但只能创建一个目录。 使用mkpath则可以创建连续的子目录。在linux下使用cp -p同样可以实现同样的功能。 再使用File::Copy来拷贝。 1 use File::Path; 2 use File::Copy;3 sub writeSubFolder4 {5 my $root E:/perl_work/; 6 …

硬盘维护方法介绍

硬盘维护方法介绍 1、保持电脑工作环境清洁 硬盘以带有超精过滤纸的呼吸孔与外界相通&#xff0c;它可以在普通无净化装置的室内环境中使用&#xff0c;若在灰尘严重的环境下&#xff0c;会被吸附到PCBA的表面、主轴电机的内部以及堵塞呼吸过滤器&#xff0c;因此必须防尘。 还…

Envoy实现.NET架构的网关(五)集成Redis实现限流

.NET网关与Gateway实战-Envoy与kong课程什么是限流限流即限制并发量&#xff0c;限制某一段时间只有指定数量的请求进入后台服务器&#xff0c;遇到流量高峰期或者流量突增时&#xff0c;把流量速率限制在系统所能接受的合理范围之内&#xff0c;不至于让系统被高流量击垮。而E…

php写带分页的留言板,php中分页程序之基于留言板详解_PHP教程

文章是重点是讲php中的分页原理&#xff0c;同时我们是利用一个实现来讲解如何在php中实现分页&#xff0c;这个就是基于自己写的留方板程序了&#xff0c;有需要的朋友可以参考一下&#xff0c;很适合于初学者哦。分页的关键问题其实在于Mysql的一个关键字limite这个关键字后边…

使用 Daynamic 动态添加属性

所谓的Dynamic 动态类型&#xff0c;页面也要是动态的&#xff08;强撸&#xff09; 很简单的 直接上代码&#xff1a; //案例一 DynamicpersonCollection new ObservableCollection(); for (var i 0; i < 10; i) { dynamic p new ExpandoObject(); ((IDictionary<str…

豆瓣9分+纪录片,每一部都美到窒息......

全世界只有3.14 % 的人关注了爆炸吧知识自然类的纪录片一直是BBC的金字招牌&#xff0c;制作精良的纪录片&#xff0c;不仅能让孩子享受视觉的艺术&#xff0c;还能通过独特的视角去解读大自然&#xff0c;真正激发出孩子探索世界的热情。也适合大人影迷们在看了N部电影后视觉疲…

Android中常用到的权限

android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问"properties"表在checkin数据库中&#xff0c;改值可以修改上传 android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置 android.permission.ACCESS_FINE_LOC…

英语中十二个月份的由来

最近在学习英文&#xff0c; 先从月份开始喽~~把整理来的12个月份分享一下(*^__^*) 一月January在罗马传说中&#xff0c;有一位名叫雅努斯的守护神&#xff0c;生有先后两副脸&#xff0c;一副回顾过去&#xff0c;一副眺望未来。人们认为选择他的名字作为除旧迎新的第一个月月…

java编写算术平均数,[求助]基础-怎样编一个计算算术平均数的程序(急啊)

[求助]基础-怎样编一个计算算术平均数的程序(急啊)刚刚开始学习JAVA,不好意思明天就要交作业了,还是编不出高手帮忙吧题目:编写一个计算随意多少个数的算术平均数的程序首先要有一个对话框,可以输入你要计算的数字如果输入的是0,则马上计算结果,0不算在内例如:输入的是1,-2,0.则…

程序怎么跑着 就卡死,句柄泄漏,内存泄漏了

一&#xff1a;背景 1. 讲故事上个月中旬&#xff0c;星球里的一位朋友在微信找我&#xff0c;说他的程序跑着跑着内存会不断的缓慢增长并无法释放&#xff0c;寻求如何解决 &#xff1f;得&#xff0c;看样子星球还得好好弄&#xff01;&#xff01;&#xff01;&#x1f602;…

活久见!一美国大爷发明了永不掉链子的自行车,垂直踩踏即可驱动

全世界只有3.14 % 的人关注了爆炸吧知识©文丨 直观学机械、自行车网最近&#xff0c;一款能永不掉链子的自行车特别火&#xff0c;咱们今天来看看它长什么样。这款自行车据说是由美国洛杉矶的一位老大爷 Rodger Parker 设计的&#xff0c;名叫&#xff1a;NuBike。设计自行…

学习xss的一些记录(一)

最近正在学习关于xss的一些知识&#xff0c;作为一个前端开发者&#xff0c;这个知识也是基础的&#xff0c;以前也没怎么好好学习与总结&#xff0c;深感惭愧&#xff0c;接下来的几天时间好好补习下。 xss是什么 xss的全称是Cross Site Scripting&#xff0c;即跨站脚本。攻击…

如何用matlab消除谐波,如何在含有整次谐波和非整次谐波的信号中去除整次谐波?...

陷波器程序如下&#xff0c;麻烦帮忙看看clc;clear all;close all;x 0 : 0.05 : 10;s 210 * exp(-0.25 * x) .* cos(2 * pi * 1.5 * x pi) 110 * exp(0.25 * x) .* cos(2 * pi * 1.0 * x pi/2 );%load data;%scc;Nlength(s); % 信号长度fs1000;…

使用Hot Chocolate创建ASP.NET Core GraphQL服务

GraphQL介绍GraphQL是一个用于API的查询语言&#xff0c;是一个使用基于类型系统来执行查询的服务端运行时。GraphQL对你的API中的数据提供了一套易于理解的完整描述&#xff0c;使得客户端能够准确地获得它需要的数据&#xff0c;而且没有任何冗余。Hot Chocolate介绍Hot Choc…

MFC中的文件读写技术

计算机室如何管理自身所存放着的大量的信息的呢&#xff1f;windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的。 面向存储的文件技术 什么是文件&#xff1f;计算机中&#xff0c;一篇文章、一幅图片、一个程序等都是以文…

[转]十五分钟介绍 Redis数据结构

下面是一个对Redis官方文档《A fifteen minute introduction to Redis data types》一文的翻译&#xff0c;如其题目所言&#xff0c;此文目的在于让一个初学者能通过15分钟的简单学习对Redis的数据结构有一个了解。 Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统…