题面

一道非常好的递推练习题。

我们考虑每次枚举第一行的操作,由上一行的状态递推出下一行的状态,最后判断最后一行是否全部为 \(1\) 即可。

实现代码时要注意一些细节问题。

#include <bits/stdc++.h>
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define itn int
#define gI gi using namespace std; typedef long long LL;
typedef pair <int, int> PII;
typedef pair <int, PII> PIII; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
} inline LL gl()
{
LL f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
} const int dx[] = {0, -1, 0, 1, 0}, dy[] = {0, 0, 1, 0, -1};
//定义常量数组表示当前要翻转的灯及它上下左右的位置 int n, m;
char g[7][7]; inline void get(int x, int y) //摁下第 x 行 y 列的灯
{
for (int i = 0; i < 5; i+=1) //将它本身及四周的灯翻转状态
{
int xx = x + dx[i], yy = y + dy[i];
if (xx >= 0 && xx <= 4 && yy >= 0 && yy <= 4) //在界内
{
//进行翻转
if (g[xx][yy] == '1') g[xx][yy] = '0';
else g[xx][yy] = '1';
}
}
} inline int getans() //求答案
{
int ans = 66666666;
for (int k = 0; k < (1 << 5); k+=1) //枚举每一种第一行的操作状态
{
int sum = 0; //操作的总数
char bf[7][7];
memcpy(bf, g, sizeof g); //先将初始状态备份
for (int j = 0; j < 5; j+=1)
{
if (k >> j & 1) //如果第 j 号灯需要翻转
{
++sum; //操作一次
get(0, j); //将第 j 号灯翻转
}
}
for (int i = 0; i < 4; i+=1) //递推出下一行的状态
{
for (int j = 0; j < 5; j+=1) //枚举第 i 行的每一盏灯
{
if (g[i][j] == '0') //如果这个灯需要被翻转
{
++sum;
get(i + 1, j); //将它下一排的灯翻转
}
}
}
bool ok = true;
for (int j = 0; j < 5; j+=1)
{
if (g[4][j] == '0') {ok = false; break;} //没有达到目标状态
}
if (ok) ans = min(ans, sum); //记录最少步数
memcpy(g, bf, sizeof g); //还原备份
}
if (ans > 6) return -1; //不能在 6 步以内达到目标状态
return ans; //返回答案
} int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
int t = gi(); //多组数据输入数据总数
while (t--)
{
for (int i = 0; i < 5; i+=1) scanf("%s", g[i]); //输入每一行的状态
printf("%d\n", getans()); //输出答案
}
return 0;
}

题解【AcWing95】费解的开关的更多相关文章

  1. ACWing95. 费解的开关

    题解 这道题目有三个状态条件值得考虑: 每一个开关被按0次或者1次才有意义,如果超过1次,那么等同于按0或1次. 最终的结果与按的顺序无关 因为2,所以可以人为地规定比较合理的顺序. 现在以每一行为顺 ...

  2. AcWing95. 费解的开关 枚举+位运算

    这道题的确比较难想,首先我们知道图比较小,有可能是枚举,那么该如何枚举呢??? 你可以发现,我们只要把第一排定了,并且保证第一排不准动,那么答案就定了 也就是说,我们首先用二进制枚举,枚举第一行需要翻 ...

  3. TyvjP1266 费解的开关

    P1266 费解的开关 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏 ...

  4. AcWing 95 费解的开关

    目录 前言 题目链接 思路 代码 前言 博客咕咕咕了好久了,是时候写一下了 题目链接 AcWing 95 费解的开关 思路 首先可以看出 1.每一个位置顶多只会操作一次.因为如果操作两次的话,相当于不 ...

  5. ACAG 0x02-4 费解的开关

    ACAG 0x02-4 费解的开关 对于这道题,我们不难发现如下性质: 每个位置之多被点击一次: 点击的先后顺序不影响结果: 若确定了第$1$行,则接下来可能的点击方案就只有$1$种.具体原因是:当第 ...

  6. TVYJ1266:费解的开关

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://www.joyoi.cn/problem/tyvj-1266 这 ...

  7. ACWING 95 费解的开关 解题记录

    你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也 ...

  8. 题解 P3870 【[TJOI2009]开关】/基础分块学习小结

    直接进入正题: 分块: 分块分块,就是把一个长串东西,分为许多块,这样,我们就可以在操作一个区间的时候,对于在区间里面完整的块,直接操作块,不完整的直接操作即可,因为不完整,再加上一个块本身就不大,复 ...

  9. 【ACwing 95】费解的开关——枚举 + 搜索

    (题面来自ACwing) 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的 ...

随机推荐

  1. Linux运维---磁盘存储-2. RAID

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  2. Zookeeper分布式系统协同器概念快速学习

    原文格式可以访问:https://www.rockysky.tech 分布式系统的基本操作 主节点选举:在绝大多数分布式系统中,都需要进行主节点选举.主节点负责管理协调其它节点或者同步集群中其它节点的 ...

  3. codewars--js--Write Number in Expanded Form—filters、map、reduce、forEach

    问题描述: you will be given a number and you will need to return it as a string in Expanded Form. For ex ...

  4. 【查阅】Chrome快捷键

    高频简要Chrome快捷键整理 记录一下Chrome常用快捷键方便查询熟悉,提高工作效率. 在我认为比较高频有用的快捷键,会加粗和标记. 在日常中熟练使用快捷键能帮助我们提高工作效率. 一 .F区单键 ...

  5. HTML连载68-形变中心点、形变中心轴

    一. 形变中心点介绍 <style> ul li { width: 100px; height: 100px; list-style: none; float:left; margin:0 ...

  6. kernel定制,编译内核

    定制kernel,就需要手动编译内核 一,准备开发环境 1,包组:Development Tools,Server Platform Development 2,包:ncurses和ncurses-d ...

  7. maven 听视频笔记

    使用  pom.xml 配置 收藏 所听视频来源: https://www.bilibili.com/video/av54119831?p=8 视频: maven  idea 配置服务器 tomcat ...

  8. 题解【CF1311F Moving Points】

    \[ \texttt{Preface} \] 赛时,把 " 任意时刻 " 理解成 " 整数时刻 " 了,看起来一脸不可做的亚子,还各种推式子. 话说我为什么觉得 ...

  9. 初识OpenSSH--1

    note:保护你的报文(communique)安全 !  最安全!!! 简介:OpenSSH使用SSH协议进行远程登录的主要连接工具.它对传输数据进行加密,以消除窃听,连接劫持和其他攻击.此外,Ope ...

  10. python3的bytes数据类型

    python已升级到了3.0,都说现在是属于python3,未来也是属于python3,那python3到底改了些什么呢? 其中我记得非常清楚的是,python3对文本和二进制数据作了更为清晰的区分. ...