当前位置: 首页 > news >正文

费解的开关/翻硬币

🌱博客主页:大寄一场.

🌱系列专栏: 算法

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注


题目:费解的开关

你玩过“拉灯”游戏吗?

25盏灯排成一个 5×5 的方形。

每一个灯都有一个开关,游戏者可以改变它的状态。

每一步,游戏者可以改变某一个灯的状态。

游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。

我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。

下面这种状态

10111

01101

10111

10000

11011

在改变了最左上角的灯的状态后将变成:

01111

11101

10111

10000

11011

再改变它正中间的灯后状态将变成:

01111

11001

11001

10100

11011

给定一些游戏的初始状态,编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮。

输入格式

第一行输入正整数 n,代表数据中共有 n 个待解决的游戏初始状态。

以下若干行数据分为 n 组,每组数据有 5 行,每行 5个字符。

每组数据描述了一个游戏的初始状态。

各组数据间用一个空行分隔。

输出格式

一共输出 n 行数据,每行有一个小于等于 6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。

对于某一个游戏初始状态,若 6步以内无法使所有灯变亮,则输出 −1。

数据范围

0<n≤500

输入样例:

3

00111
01011
10001
11010
11100

11101
11101
11110
11111
11111

01111
11111
11111
11111
11111

输出样例:

3

2

-1

例如:

00111
01011
10001
11010
11100

 则最少需要3步

算法思路

我们枚举第一行的点击方法(按或不按),共2^5=32种,完成第一行的点击后,固定第一行,
从第一行开始递推,若最后一行有0(暗),说明这种方式无解。在所有合法的点击方式中取点击次数最少的就是答案。若点击次数大于6还无法使所有灯变亮,则输出 −1。

时间复杂度:32*25*5*500 = 200 000 000
 对第一行操作有32种可能 * 25个格子 * 每一次操作都要改变5个灯的状态 * 最多读入的时候可能有500次light矩阵

最关键的两点
1.要使得步数最少则每一个位置最多只会被点击一次
2.每一行开关的操作被前一行灯的亮灭所操作。

 比如说 上图若固定第一行,则第二行只能操作第二格。

所以说第一行的固定可以决定整个棋盘的操作

那么我们如何枚举第一行的操作呢?

若用0 (不操作)1(操作)来表示

举个栗子 :

1 1 1 1 1->用10进制表示为31

0 0 0 0 0->用10进制表示为0

即第一行的操作可以用 0~2^5 -1=31来对应

tips:这里如何判断op的二进制表示的第k位是否为1

op>>k&1

再举个栗子   26->1 1 0 1 0 (位数分别为 4 3 2 1 0)   判断它的第一位是否为1

1 1 0 1 0>>1  ->1 1 0 1

1 1 0 1&1=1(&运算 两个位都为1时,结果为1。)

 for (int op = 0; op < 32; op ++ )//枚举第一行的操作{int step = 0;for (int i = 0; i < 5; i ++ )if (op >> i & 1){step ++ ;turn(0, i);}}

操作五个灯(偏移量)

turn(x,y)

 

int dx[5] = {-1, 0, 1, 0, 0}, dy[5] = {0, 1, 0, -1, 0};//偏移量
void turn(int x, int y)
{for (int i = 0; i < 5; i ++ ){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= 5 || b < 0 || b >= 5)//判断是否出界continue;   g[a][b] ^= 1;//‘0’的ascall码为48;二进制表示110000,‘1’的ascall码为49;二进制表示110001}
}

判断最后一行灯的情况

 bool dark = false;//判断最后一行是否有暗,有则方案无解for (int i = 0; i < 5; i ++ )if (g[4][i] == '0'){dark = true;break;}if (!dark) res = min(res, step);//无则记录最小步数

完整代码: 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 6;// /‘0’
char g[N][N], backup[N][N];
int dx[5] = {-1, 0, 1, 0, 0}, dy[5] = {0, 1, 0, -1, 0};//偏移量void turn(int x, int y)
{for (int i = 0; i < 5; i ++ ){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= 5 || b < 0 || b >= 5)//判断是否出界continue;   g[a][b] ^= 1;//‘0’的ascall码为48;二进制表示110000,‘1’的ascall码为49;二进制表示110001}
}int main()
{int T;cin >> T;while (T -- )//T组测试数据{for (int i = 0; i < 5; i ++) //打印棋盘5*5cin >> g[i];int res = 10;for (int op = 0; op < 32; op ++ )//枚举第一行的操作{memcpy(backup, g, sizeof g);int step = 0;for (int i = 0; i < 5; i ++ )if (op >> i & 1){step ++ ;turn(0, i);}for (int i = 0; i < 4; i ++ )for (int j = 0; j < 5; j ++ )if (g[i][j] == '0'){step ++ ;turn(i + 1, j);}bool dark = false;//判断最后一行是否有暗,有则方案无解for (int i = 0; i < 5; i ++ )if (g[4][i] == '0'){dark = true;break;}if (!dark) res = min(res, step);memcpy(g, backup, sizeof g);}if (res > 6) res = -1;cout << res << endl;}return 0;
}

 题目:翻硬币 

小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:**oo***oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入格式

两行等长的字符串,分别表示初始状态和要达到的目标状态。

输出格式

一个整数,表示最小操作步数

数据范围

输入字符串的长度均不超过100。
数据保证答案一定有解

输入样例1:

**********
o****o****

输出样例1:

5

输入样例2:

*o**o***o***
*o***o**o***

输出样例2:

1

从左开始遍历,一次翻转相邻的俩个

 

关键的两点

1.操作顺序无影响

2.最多一次

翻转操作

void turn(int i)
{if(start[i]=='*')  start[i]='o';else start[i]='*';}

 完整代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;const int N=110;//输入字符串的长度均不超过100。
int n;
char start[N],ed[N];//两行等长的字符串,分别表示初始状态和要达到的目标状态。void turn(int i)
{if(start[i]=='*')  start[i]='o';else start[i]='*';}int main()
{cin>>start>>ed;n=strlen(start);int res=0;for(int i=0;i<n-1;i++)//从左开始遍历if(start[i]!=ed[i]) //判断初始状态和目标状态是否相同{turn(i),turn(i+1); //不同则翻转相邻俩个硬币res++;}cout<<res<<endl;
return 0;    
}

 看到这里的话,感谢各位佬的支持!

相关文章:

费解的开关/翻硬币

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a; 算法 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 题目&#xff1a;费解的开关 你玩过“拉灯”游戏吗&#xff1f; 25盏灯排成一个 55 的方形。 每一个灯都有一个开关&…...

OpenGL中的坐标系

1、2D笛卡尔坐标系2D笛卡尔坐标系跟我们高中的时候学习的坐标系一样&#xff0c;是由x、y决定的。2、3D笛卡尔坐标系3D笛卡尔坐标系坐标由x、y、z决定&#xff0c;满足右手定则。3、视口glViewport(GLint x,GLint y,GLsizei width,GLsizei height)窗口和视口大小可以相同&#…...

Spring——Spring介绍和IOC相关概念

Spring是以Spring Framework为核心&#xff0c;其余的例如Spring MVC&#xff0c; Spring Cloud&#xff0c;Spring Data&#xff0c;Spring Security SpringBoot的基础都是Spring Framework。 Spring Boot可以在简化开发的基础上加速开发。 Spring Cloud分布式开发 Spring有…...

A+B Problem

AB Problem 题目描述 输入两个整数 a,ba, ba,b&#xff0c;输出它们的和&#xff08;∣a∣,∣b∣≤109|a|,|b| \le {10}^9∣a∣,∣b∣≤109&#xff09;。 注意 Pascal 使用 integer 会爆掉哦&#xff01;有负数哦&#xff01;C/C 的 main 函数必须是 int 类型&#xff0c;…...

【ROS学习笔记11】ROS元功能包与launch文件的使用

【ROS学习笔记11】ROS元功能包与launch文件的使用 文章目录【ROS学习笔记11】ROS元功能包与launch文件的使用前言一、ROS元功能包二、ROS节点运行管理launch文件2.1 launch文件标签之launch2.2 launch文件标签之node2.3 launch文件标签之include2.4 launch文件标签之remap2.5 l…...

【python】

print函数 同时输出多行变量 print(a, b, sep\n) (23条消息) python3 中print函数参数详解&#xff0c;print(*values, sep , end\n, filesys.stdout, flushFalse)中参数介绍_sep,_phantom-dapeng的博客-CSDN博客 input() 输入浮点数&#xff0c;不能用int(input()) int()…...

充电协议: 快充协议,如何选充电宝?

快充协议(存在两种&#xff1a;电压; 电流) 目前市面上的快充技术大多遵循2个技术方向&#xff1a; 以高通QC、联发科PEP、华为FCP为首的高压低电流快充技术&#xff1b; 另一种就是以OPPO的VOOC以及华为SCP为首的低电压大电流快充技术。 目前常见的快充标准还有三星AFC、联发…...

视觉SLAM十四讲ch6 非线性优化笔记

视觉SLAM十四讲ch6 非线性优化笔记本讲目标上讲回顾状态估计问题非线性最小二乘Gauss-Newton&#xff1a;高斯牛顿Levenburg-Marquadt&#xff1a;列文伯格-马夸尔特小结实践&#xff1a;CERES实践&#xff1a;G2O本讲目标 理解最小二乘法的含义和处理方式。 理解Gauss-Newton…...

Nikto工具使用指南

NiktoNikto是一款开源网站服务器扫描器&#xff0c;使用Perl开发&#xff0c;可以对服务器进行全面扫描&#xff0c;包括6400多个潜在危险的文件/cgi(通用网关接口&#xff08;Common Gateway Interface&#xff09;),废话不多说&#xff0c;直接上命令&#xff1a;基本测试&am…...

Git(4)之基本工具

Git基础之基本工具 Author&#xff1a;onceday date&#xff1a;2023年3月5日 满满长路有人对你微笑过嘛… windows安装可参考文章&#xff1a;git简易配置_onceday_CSDN博客 參考文档&#xff1a; 《progit2.pdf》&#xff0c;Progit2 Github。《git-book.pdf》 文章目录…...

好书推荐。

个人喜欢看传记&#xff0c;散文&#xff0c;历史等 二战名人传记&#xff0c;苏联列宁&#xff0c;朱可夫&#xff0c;斯大林等 英国首相丘吉尔&#xff0c;美国富兰克林&#xff0c;中国毛泽东等 创业&#xff1a;比尔盖&#xff0c;扎克伯格&#xff0c;苹果公司创始人乔…...

[Pytorch]DataSet和DataLoader逐句详解

将自己的数据集引入Pytorch是搭建属于自己的神经网络的重要一步&#xff0c;这里我设计了一个简单的实验&#xff0c;结合这个实验代码&#xff0c;我将逐句教会大家如何将数据引入DataLoader。 这里以目标检测为例&#xff0c;一个batch中包含图片文件、先验框的框体坐标、目标…...

【Kettle-佛系总结】

Kettle-佛系总结Kettle-佛系总结1.kettle介绍2.kettle安装3.kettle目录介绍4.kettle核心概念1.转换2.步骤3.跳&#xff08;Hop&#xff09;4.元数据5.数据类型6.并行7.作业5.kettle转换1.输入控件1.csv文件输入2.文本文件输入3.Excel输入4.XML输入5.JSON输入6.表输入2.输出控件…...

JavaSE网络编程

JavaSE网络编程一、基本概念二、常用类三、使用方法1、创建服务器端Socket2、创建客户端Socket3、创建URL对象JavaSE中的网络编程模块提供了一套完整的网络编程接口&#xff0c;可以方便地实现各种基于网络的应用程序。本文将介绍JavaSE中网络编程模块的基本知识、常用类以及使…...

9万字“联、管、用”三位一体雪亮工程整体建设方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 1、 总体设计方案 围绕《公共安全视频监控建设联网应用”十三五”规划方案》中的总体架构和一总两分结构要求的基础上&#xff0c;项目将以“加强社会公共安全管理&#xff0c;提高…...

springboot自动装配原理

引言 springboot的自动装配是其重要特性之一&#xff0c;在使用中我们只需在maven中引入需要的starter&#xff0c;然后相应的Bean便会自动注册到容器中。例如&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…...

Docker学习(二十)什么是分层存储?

目录1.简介2.什么是 Union Mount&#xff1f;3.分层介绍1&#xff09;lowerdir 层&#xff08;镜像层&#xff09;2&#xff09;upperdir 层&#xff08;容器层&#xff09;3&#xff09;merged 层4.工作原理1&#xff09;读&#xff1a;2&#xff09;写&#xff1a;3&#xff…...

Vue组件进阶(动态组件,组件缓存,组件插槽,具名插槽,作用域插槽)与自定义指令

Vue组件进阶与自定义指令一、Vue组件进阶1.1 动态组件1.2 组件缓存1.3 组件激活和非激活1.4 组件插槽1.5 具名插槽1.6 作用域插槽1.7 作用域插槽使用场景二、自定义指令2.1 自定义指令--注册2.2 自定义指令-传参一、Vue组件进阶 1.1 动态组件 多个组件使用同一个挂载点&#x…...

僵尸进程与孤儿进程

概念 在 Unix/Linux 系统中&#xff0c;正常情况下&#xff0c;子进程是通过父进程创建的&#xff0c;且两者的运行是相互独立的&#xff0c;父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时&#xff0c;其实它并没有真正的被销毁&#…...

基于注解@Transactional事务基本用法

关于概念性的放在最下面,熟读几遍 在使用时候也没多关注,总是加个Transactional 初识下 一般查询 Transactional(propagation Propagation.SUPPORTS) 增删改 Transactional(propagation Propagation.REQUIRED) 当然不能这么马虎 Spring中关于事务的传播 一个个测试,事…...

XUnity.AutoTranslator终极指南:5步轻松实现Unity游戏多语言自动翻译

XUnity.AutoTranslator终极指南&#xff1a;5步轻松实现Unity游戏多语言自动翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款功能强大的Unity游戏自动翻译插件&#xff0…...

【hloc】从特征提取到三维重建:视觉定位全流程解析

1. 视觉定位技术全景图 当你用手机地图导航时&#xff0c;有没有想过它是如何精确知道你的位置的&#xff1f;这背后就运用了视觉定位技术。视觉定位&#xff08;Visual Localization&#xff09;是指通过摄像头捕捉环境图像&#xff0c;然后与预先构建的三维地图进行匹配&…...

CasRel模型部署教程:使用Triton推理服务器实现高并发SPO服务

CasRel模型部署教程&#xff1a;使用Triton推理服务器实现高并发SPO服务 1. 认识CasRel关系抽取模型 CasRel&#xff08;Cascade Binary Tagging Framework&#xff09;是一个专门从文本中提取结构化信息的强大模型。想象一下&#xff0c;你有一大段文字&#xff0c;里面包含…...

效率翻倍!LiuJuan Z-Image多图批量生成攻略,一次产出N张创意作品

效率翻倍&#xff01;LiuJuan Z-Image多图批量生成攻略&#xff0c;一次产出N张创意作品 在AI图片生成领域&#xff0c;最令人头疼的莫过于反复调整参数、等待单张图片生成的低效流程。今天&#xff0c;我将分享如何利用LiuJuan Z-Image Generator的批量生成功能&#xff0c;一…...

云容笔谈·东方红颜影像生成系统Python爬虫实战:自动化采集图像数据训练集

云容笔谈东方红颜影像生成系统Python爬虫实战&#xff1a;自动化采集图像数据训练集 最近在尝试训练一个专注于东方人物风格的AI绘画模型&#xff0c;最头疼的问题就是数据。网上图片虽然多&#xff0c;但风格杂乱、质量参差不齐&#xff0c;手动一张张找、一张张筛&#xff0…...

国产AI芯动力:复旦微FMQL100TAI900 FPGA原型验证板全解析

1. 这块国产FPGA板卡凭什么值得关注&#xff1f; 第一次拿到复旦微FMQL100TAI900开发板时&#xff0c;最让我惊讶的是其全产业链国产化的完成度。从主芯片到电源管理IC&#xff0c;甚至每个电阻电容都贴着中文标识&#xff0c;这在三年前根本不敢想象。作为长期从事AI硬件开发的…...

Linux实现简易版Shell的代码详解

一、程序流程分析我们日常使用Bash时&#xff0c;通过输入命令执行相应的操作&#xff0c;比如&#xff1a;那么&#xff0c;Bash是如何进行工作的呢&#xff1f;观察一下&#xff0c;就会发现&#xff0c;首先Bash会打印命令行提示符&#xff0c;包括当前用户、主机名以及路径…...

【第五周】关键词解释:稀疏自编码器(Sparse Autoencoder,简称 SAE)

&#x1f9e0; 当我们在谈论"理解"大模型时&#xff0c;我们在谈论什么&#xff1f;今天我们要聊的关键词&#xff0c;可能是2024-2025年大模型可解释性领域最炙手可热的技术之一&#xff1a;稀疏自编码器&#xff08;Sparse Autoencoder&#xff0c;简称 SAE&#x…...

C++的std--ranges中的策略内联编译器

C的std::ranges中的策略内联编译器&#xff1a;高效编程的新利器 在现代C编程中&#xff0c;std::ranges库的引入为算法和范围操作带来了革命性的改进。其中&#xff0c;策略内联编译器作为其核心优化手段之一&#xff0c;能够显著提升代码执行效率。本文将深入探讨这一技术的…...

Linux开发实战:Shell脚本与构建系统进阶指南

1. Linux开发者工具箱&#xff1a;从基础到进阶的实用指南作为一名在Linux环境下摸爬滚打多年的开发者&#xff0c;我深知高效工具链对生产力提升的重要性。这个系列文章最初只是我个人工作笔记的整理&#xff0c;后来逐渐发展成覆盖Linux开发全流程的实用指南。不同于教科书式…...