洛谷 P2040 打开所有的灯 题解
这个题写其他题解的dalao们已经解释了
一个灯最多开一次(如果实在不知道为什么看评论区)
这个题一共就9个灯嘛,对吧
递归好想不好写(对于我这种蒟蒻)
所以我写了一个所有题解中最暴力的
直接枚举9个灯的开关状态就可以了
我们把原先的数组开半天在初始化不如弄一个已经全开了的数组开半天看看能不能返回原先的状态就好了更方便一点
//打开所有的灯 九层循环法
#include<bits/stdc++.h>
using namespace std;
inline int read() {//快读
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void write(int x) //快写{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
int b[11][11],c[11][11],a[11][11],tot,zx = 999;
int xx[] = {0,1,-1,0,0},yy[] = {0,0,0,1,-1},d[10];
int pd(int x) {//判断在哪一行
if(x <= 3)
return 1;
if(x >= 7)
return 3;
return 2;
}
void kd(int x,int y) {//开它周围的灯
for(int i = 0; i <= 4; ++i) {
int x2 = x + xx[i] , y2 = y + yy[i];
c[x2][y2] == 1 ? c[x2][y2] = 0 : c[x2][y2] = 1;
}
}
bool jc() {//判断是否全打开了
for(int i = 1; i <= 3; ++i)
for(int j = 1; j <= 3; ++j)
if(a[i][j] != c[i][j])
return 0;
return 1;
}
int main(int argc, char const *argv[]) {
for(int i = 1; i <= 3; ++i)//读入并初始化c
for(int j = 1; j <= 3; ++j) {
a[i][j] = read();
c[i][j] = 1;
}
int he = 0;
for(d[1] = 0; d[1] <= 1; ++d[1])
for(d[2] = 0; d[2] <= 1; ++d[2])
for(d[3] = 0; d[3] <= 1; ++d[3])
for(d[4] = 0; d[4] <= 1; ++d[4])
for(d[5] = 0; d[5] <= 1; ++d[5])
for(d[6] = 0; d[6] <= 1; ++d[6])
for(d[6] = 0; d[6] <= 1; ++d[6])
for(d[7] = 0; d[7] <= 1; ++d[7])
for(d[8] = 0; d[8] <= 1; ++d[8])
for(d[9] = 0; d[9] <= 1; ++d[9]) {
for(int i = 1; i <= 9; ++i) {
if(d[i] == 1) {//如果开着
kd(pd(i),i % 3 == 0 ? 3 : i % 3);开灯
he ++;//计数器
if(he > zx)//如果不是正解直接退出
break;
}
}
if(jc() && he < zx) {//如果全都开了并且比最小值小
zx = he;
}
he = 0;
for(int i = 1; i <= 3; ++i)//清空数组
for(int j = 1; j <= 3; ++j)
c[i][j] = 1;
}
write(zx);
cout<<endl;
return 0;
}
友情赠送(递归版本)
//打开所有的灯 递归法
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
int b[11][11],c[11][11],a[11][11],tot,zx = 999;
int xx[] = {0,1,-1,0,0},yy[] = {0,0,0,1,-1},d[10];
void kd(int x,int y) {
for(int i = 0; i <= 4; ++i) {
int x2 = x + xx[i] , y2 = y + yy[i];
c[x2][y2] == 1 ? c[x2][y2] = 0 : c[x2][y2] = 1;
}
}
bool jc() {
for(int i = 1; i <= 3; ++i)
for(int j = 1; j <= 3; ++j)
if(a[i][j] != c[i][j])
return 0;
return 1;
}
void dg(int x,int y,int tot) {
if(x == 4) {
if(jc() == 1)
zx = min(zx,tot);
return ;
}
kd(x,y);
y == 3 ? dg(x + 1,1,tot + 1) : dg(x,y + 1,tot + 1);
kd(x,y);
y == 3 ? dg(x + 1,1,tot) : dg(x,y + 1,tot);
}
int main(int argc, char const *argv[]) {
for(int i = 1; i <= 3; ++i)
for(int j = 1; j <= 3; ++j) {
a[i][j] = read();
c[i][j] = 1;
}
int he = 0;
dg(1,1,0);
write(zx);
cout<<endl;
return 0;
}
洛谷 P2040 打开所有的灯 题解的更多相关文章
- 洛谷——P2040 打开所有的灯
P2040 打开所有的灯 题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就 ...
- 洛谷 P2040 打开所有的灯
P2040 打开所有的灯 题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就 ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- HAOI2006 (洛谷P2341)受欢迎的牛 题解
HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)
洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...
- BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...
- 洛谷1578:[WC2002]奶牛浴场——题解
https://www.luogu.org/problemnew/show/P1578#sub 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建 ...
- 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)
科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...
随机推荐
- EF之DataBase添加新字段
数据库中表添加新字段后,在EF的xml格式的中找到与表名相同的节点添加新字段 (SSDL.CSDL和C-S都要添加相关信息)
- c#结束练习题
1.输入一个秒数,输出对应的小时.分钟.秒. 例:输入“4000“(秒),输出“1小时6分40秒”. 2.计算1-1/2+1/3-1/4+...-1/100的值. 3.写一个函数,对一个一维数组排序. ...
- Springboot - java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'
Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning a simple key in 'reader', lin ...
- spark任务在executor端的运行过程分析
CoarseGrainedExecutorBackend 上一篇,我们主要分析了一次作业的提交过程,严格说是在driver端的过程,作业提交之后经过DAGScheduler根据shuffle依赖关系划 ...
- Java集合学习(6):LinkedHashSet
一.概述 首先我们需要知道的是它是一个Set的实现,所以它其中存的肯定不是键值对,而是值.此实现与HashSet的不同之处在于,LinkedHashSet维护着一个运行于所有条目的双重链接列表.此链接 ...
- OCR2:tesseract字库训练
由于tesseract的中文语言包“chi_sim”对中文字体或者环境比较复杂的图片,识别正确率不高,因此需要针对特定情况用自己的样本进行训练,提高识别率,通过训练,也可以形成自己的语言库. 工具: ...
- Python之路(第四十四篇)线程同步锁、死锁、递归锁、信号量
在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock ...
- Redhat6.5安装oracle11g
Redhat6.5安装oracle11g 一. 安装环境 linux服务器:Redhat 6.5 64位 oracle版本:oracle11gR2 远程windows服务器:已安装Xmanage ...
- Haproxy 反向代理
一.haproxy介绍 HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. 特点如下: .支持两种代理模式:TCP(四层)和H ...
- Linux命令学习之文件管理
~~~~~~~~~~~~ 前言 ~~~~~~~~~~~~ 推荐一个很好的练习平台:https://overthewire.org/wargames/ Wargames有很多个关卡,从基础的Linux使 ...