ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing 95. 费解的开关 (递归&位运算)

2022-03-21 18:35:04  阅读:129  来源: 互联网

标签:状态 游戏 递归 int res ++ 11111 95 AcWing


你玩过“拉灯”游戏吗?

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

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

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

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

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

下面这种状态

10111
01101
10111
10000
11011

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

01111
11101
10111
10000
11011

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

01111
11001
11001
10100
11011

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

输入格式

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

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

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

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

输出格式

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

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

数据范围

0<n≤5000<n≤500

输入样例:

3
00111
01011
10001
11010
11100

11101
11101
11110
11111
11111

01111
11111
11111
11111
11111

输出样例:

3
2
-1

AC

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 6;

char e[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; //越界 忽略 
		e[a][b] ^= 1;  //不同为1 相同为0 
	}
}

int main()
{
	int t;
	cin >> t;
	while(t --)
	{
		for (int i = 0; i < 5; i ++)
			cin >> e[i];
	
		int res = 10;
		for (int op = 0; op < 32; op ++) //第一行的灯可以有2^5种开关法  
		{
			memcpy(backup, e, sizeof e); //原数据备份 然后操作e 操作完了还原 再操作
			int step = 0;
			for (int i = 0;i < 5; i ++)
				if (op >> i & 1) //二进制下第i位为1才1 
				{
					step ++;
					turn(0, i); //当这个地方是1的时候去按这个位置 
				} 
			
			for (int i = 0; i < 4 ;i++) // 第1行按完之后 按三四行 
				for (int j = 0; j < 5; j++)
					if (e[i][j] == '0')
					{
						step++;
						turn(i + 1, j);
					}
			
			bool close = false;
			for (int i = 0; i < 5; i ++) //根据最后一行判断是否所有灯都亮了 
				if (e[4][i] == '0')
					close = true;
					
			if (!close) res = min(res, step);
			memcpy(e, backup, sizeof e);
		}
		
		if (res > 6)
			res = -1;
		cout << res << endl;
	}
	return 0;
}

标签:状态,游戏,递归,int,res,++,11111,95,AcWing
来源: https://blog.csdn.net/m0_58245389/article/details/123642361

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有