首页 > 其他分享 >P10449 费解的开关

P10449 费解的开关

时间:2024-07-05 22:31:20浏览次数:16  
标签:状态 初始状态 游戏 P10449 int 费解 开关 点击 11111

费解的开关

题目描述

你玩过“拉灯”游戏吗?

\(25\) 盏灯排成一个 \(5 \times 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

样例 #1

样例输入 #1

3
00111
01011
10001
11010
11100

11101
11101
11110
11111
11111

01111
11111
11111
11111
11111

样例输出 #1

3
2
-1

提示

测试数据满足 \(0 < n \le 500\)。

思路

对于一行中的0,我们不难想到,直接点击它会影响左右的数字。所以便去点击这个0对应下一行的位置。

还有一个性质,当第一行的点击方式固定了之后,按照上述的方法点击剩下的\(n - 1\)行,点击方案唯一且确定。

于是我们不妨考虑枚举第一行的点击方式,采用位运算枚举的方式,有\(2 ^ 5 = 32\)种可能。

最后记得另用数组暂存原矩阵。

代码实现

#include<bits/stdc++.h>
using namespace std;
char a[6][6],b[6][6];
int dx[5]={1,-1,0,0,0};
int dy[5]={0,0,0,-1,1},ans=1e9;
//void print()
//{
//	for(int i=0;i<5;i++)
//	{
//		cout<<a[i]<<endl;
//	}
//}
bool check(int x,int y)
{
	return x>=0&&x<5&&y>=0&&y<5;
}
void change(int i,int j)
{
	for(int p=0;p<5;p++)
	{
		int x=i+dx[p],y=j+dy[p];
		if(check(x,y)) a[x][y]^=1;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--)
	{
		for(int i=0;i<5;i++)
		{
			cin>>a[i];
		}
		int cnt=0;
		for(int pos=0;pos<32;pos++)
		{
			cnt=0;
			memcpy(b,a,sizeof a);
			for(int i=0;i<5;i++)
			{
				if(pos>>i&1)
				{
					cnt++;
					change(0,i);
				}
			}
			for(int i=0;i<4;i++)
			{
				for(int j=0;j<5;j++)
				{
					if(a[i][j]=='0')
					{
						cnt++;
						change(i+1,j);
					}
				}
			}
			bool flag=true;
			for(int i=0;i<5;i++)
			{
				if(a[4][i]=='0')
				{
					flag=false;
					break;
				}
			}
			if(flag) ans=min(ans,cnt);
			memcpy(a,b,sizeof b);
		}
		if(ans>6)
		{
			ans=-1;
		}
		cout<<ans<<endl;
		ans=1e9;
	}
	return 0;
}

在首次写完代码后,结果是WA,后来经过多次调试才知道memcpy函数这种浅复制不能复制string这种数据结构,还有含指针的结构体也不能复制。

标签:状态,初始状态,游戏,P10449,int,费解,开关,点击,11111
From: https://www.cnblogs.com/j1hx-oi/p/18286694

相关文章

  • 开关电源三种基本拓扑的总结及其应用实例
    一、开关电源拓扑基础传统的开关电源拓扑可分为三种:Buck(降压型)、Boost(升压型)、Buck-Boost(升降压型)。对这三种拓扑归纳如下。1.1Buck-BoostBuck-Boost根据地参考点的位置可以进一步细分为正对负型和负对正型。升降压型拓扑的端口特性为:输入与输出反相;可升压也可降压。电......
  • 《安富莱嵌入式周报》第339期:单片机运行苹果早期Mac系统模拟器,2GHz示波器有源探头,下一
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版https://www.bilibili.com/video/BV1Kf421Q7Lh目录1、开源2GHz的示波器有源探头2、模拟矩阵开关面包板Jumperless推出下一代JumperlessV53、软件相关(1)Swifton......
  • Arduino 驱动倾斜开关传感器
    下面是使用ArduinoUnoR3驱动倾斜开关传感器模块的详细说明、接线图和代码示例。所需材料ArduinoUnoR3倾斜开关传感器模块面包板和连接线接线步骤供电和地线连接:将ArduinoUno的5V引脚连接到倾斜开关传感器模块的VCC引脚。将ArduinoUno的GND引脚连接到倾斜开关传......
  • windows下使用bat定时开关windows的一项服务
    原文链接:windows下使用bat定时开关windows的一项服务–每天进步一点点(longkui.site)一个需求要求每天定时开关一项服务。假如这项服务是Redis。那么用什么指令呢?其实很简单,用下方两个指令就可以开关某个服务:netstart服务名netstop服务名我们用管理员方式打开cmd(比......
  • 零停机部署——特征开关(Feature Toggles)的应用
    引言在现代软件开发和部署中,零停机部署技术是实现高可用性和无缝用户体验的关键。本文将讨论功能开发开关(FeatureToggles)的类型并分析它们的优缺点,同时提供相关的例子和演示。PS:https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star!功能开发(Featu......
  • 提供一系列RF和微波:MMA041AA、MMA040AA(射频放大器)MMA022AA,MMS008AA射频开关
    MMA041AA是一款低噪声分布式放大器芯片,工作频率范围为DC至26GHz。该放大器提供18dB的平坦增益、3.2dB噪声系数和22dBm输出功率(1dBm增益压缩)。MMA041AA放大器具有内部匹配50ω的RFI/O,便于集成到MCM中。非常适合测试仪器和通信基础设施应用。特性宽带性能:DC至26GHz高增益......
  • 八路DI八路DO开关量输入输出 远程IO模块 Modbus TCP数据采集模块 YL90
    特点:●八路开关量输入,八路开关量输出● DI状态变化自动发送状态数据,可以捕获脉冲● 采用Socket自由协议编程简单、轻松应用● 开关量毫秒级响应速度适应多种场合● 内置网页功能,可以通过网页查询与控制● 同时也支持ModbusTCP通讯协议● 宽电源供电范围:8~32......
  • 基于TMS320F28335的开关电源模块并联供电系统
    开关电源模块并联供电系统目录引言2一、系统方案31.1DC-DC主回路的论证与选择31.2控制方法及实现方案4二、系统理论分析与计算42.1系统整体方案42.2DC-DC模块的设计52.3信号采样与参数测量子系统的设计53.1电路的设计63.1.1反激式电源模块系统框......
  • 台球室用的开关灯系统,佳易王桌球灯控计费系统操作教程
    台球室用的开关灯系统,佳易王桌球灯控计费系统操作教程一、前言以下软件操作教程以,佳易王台球开关灯控管理软件为例说明软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载软件操作教程1、开关灯参数设置:系统设置——端口设置灯控器使用usb转串口线与电......
  • P10499 开关问题 题解
    题目传送门前置知识高斯消元法解异或方程组|乘法原理解法把开关的相互影响关系转化成异或,然后就转化成了异或方程组,高斯消元求解即可。判断是否存在解的过程同luoguP2455[SDOI2006]线性方程组。由于自由元仅能取\(0/1\),故总方案数为\(2\)的自由元数量次方。代码......