费解的开关

题目链接

95. 费解的开关

你玩过“拉灯”游戏吗?

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<n500

输入样例:

3 00111 01011 10001 11010 11100 11101 11101 11110 11111 11111 01111 11111 11111 11111 11111

输出样例:

3 2 -1

解题思路

贪心+递推

确定第一行状态后,其他状态都可以递推得到,同时递推过程中,如果发现操作数大于 6,暂停该过程,否则最后判断最后一行是否有没有关闭的灯即可,第一行的状态即指数型枚举可以使用dfs实现~

  • 时间复杂度:O(25×25)

代码

#include<bits/stdc++.h> using namespace std; const int inf=0x3f3f3f3f; int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1}; char s[10][10],bs[10][10]; vector<int> chosen; int n,res; void turn(int x,int y) { for(int i=0;i<5;i++) { int nx=x+dx[i],ny=y+dy[i]; if(nx>=1&&nx<=5&&ny>=1&&ny<=5)s[nx][ny]^=1; } } int cal(int cnt) { for(int i=2;i<=5;i++) for(int j=1;j<=5;j++) if(s[i-1][j]=='0') { cnt++; if(cnt>6)return inf; turn(i,j); } for(int i=1;i<=5;i++) if(s[5][i]=='0')return inf; return cnt; } void dfs(int pos) { if(pos==6) { for(int &i:chosen)turn(1,i); res=min(res,cal(chosen.size())); return ; } chosen.push_back(pos); memcpy(bs,s,sizeof s); dfs(pos+1); chosen.pop_back(); memcpy(s,bs,sizeof s); dfs(pos+1); } int main() { for(scanf("%d",&n);n;n--) { res=inf; for(int i=1;i<=5;i++)scanf("%s",s[i]+1); dfs(1); printf("%d\n",res==inf?-1:res); } return 0; }

__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/15521094.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示