首页 > 其他分享 >AcWing 95. 费解的开关

AcWing 95. 费解的开关

时间:2024-04-30 09:11:56浏览次数:24  
标签:状态 游戏 改变 int 费解 ++ 11111 95 AcWing

原题链接
你玩过“拉灯”游戏吗?

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
题解

枚举每个方形的第一行的所有可能, 这里用二进制表示, 当前位上是 1 表示改变当前位置和周围的灯
每种可能第一行确定之后, 后面的 n - 1 行的都有确定的情况, 最后判断最后一行是否都为 1, 都为 1 并且改变的 次数 小于等于 6 的话满足条件


下图模拟的是样例输入的第一个方阵

  • 当 op 等于 16 的时候是该题的解, (16)2 = 10000, 表示改变第一行的第一个灯
  • [2,5]行的操作要根据它上一行灯的状态, 当 (i - 1, j) 的灯是灭的, 就改变(i, j)位置的灯和它(上下左右的灯)
  • 图中圈红的 (3,3)位置上面的(2,3)灯是灭的, 所有改变(3,3)的灯和它上下左右的灯, 另一个圈红的同上~~
#include <bits/stdc++.h>
using namespace std;
const int N = 10, n = 5;
char g[N][N], back[N][N];
int go[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
void change(int x, int y)
{
    g[x][y] = (g[x][y] == '0' ? '1' : '0');
    for (int i = 0; i < 4; i ++)
    {
        int a = x + go[i][0], b = y + go[i][1];
        if (a < 0 || a >= n || b < 0 || b >= n) continue;
        g[a][b] = (g[a][b] == '0' ? '1' : '0');
    }
}

int main()
{
    int T;
    cin >> T;
    while (T --)
    {
        for (int i = 0; i < n; i ++)
            cin >> g[i];
        
        vector<int> res;  // 存答案
        memcpy(back, g, sizeof g);  // 我们枚举的时候会改变 g 的状态, back留作备份
        for (int op = 0; op < 32; op ++)  // [0,31] 的二进制刚好枚举完第一行的所有可能 (从二进制 [00000,11111])
        {  
            int step = 0;     // 记录每种枚举的操作步数
            memcpy(g, back, sizeof back);  // 初始化 g 的状态为 原状态
            for (int j = 0; j < n; j ++)
                if (op >> j & 1)
                {
                    step ++;
                    change(0, n - j - 1);
                }

            for (int i = 1; i < n; i ++)
                for (int j = 0; j < n; j ++)
                    if (g[i - 1][j] == '0')
                    {
                        change(i, j);
                        step ++;
                    }

            bool f = true;
            for (int i = 0; i < n; i ++)
                if (g[n - 1][i] == '0')
                {
                    f = false;  // 最后一行还有灭的灯的话, 不满足条件
                    break;
                }
            
            if (f && step <= 6) res.push_back(step);
        }
        if (res.size() == 0) cout << -1 << endl;
        else
        {
            sort(res.begin(), res.end());  // 步数最少, 取最小值
            cout << res[0] << endl;
        }
    }
    return 0;
}

标签:状态,游戏,改变,int,费解,++,11111,95,AcWing
From: https://www.cnblogs.com/xxctx/p/18167022

相关文章

  • 题解:CF1957A Stickogon
    CF1957AStickogon题意题意十分简单,给予你\(n\)个棍子,问这些棍子可以构成多少个正多边形。思路说是可以构成多少个正多边形,所以我们可以用边最少的正多边形等边三角形来计数。在输入\(a\)的时候,用一个数组\(f\)来计算\(a\)出现的次数,当\(f_{a}\)等于\(3\)时,答案......
  • 马斯克突击访华;谷歌 Python 基础团队全数被裁;丨 RTE 开发者日报 Vol.195
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 电动车摩托车灯DC-DC降压恒流芯片AP5170支持线性调光95%高效率IC
    AP5170是一款效率高,稳定可靠的LED灯恒流驱动控制芯片,内置高精度比较器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率LED恒流驱动。AP5170采用ESOP8封装,散热片内置接SW脚,通过调节外置电流检测的电阻值来设置流过LED灯的电流,支持外加电压线性调光,最大电流1.5A。......
  • LED车灯IC降压恒流驱动AP5103大功率95%高效率深度调光摩托车灯芯片
    产品描述AP5103是一款效率高,稳定可靠的LED灯恒流驱动控制芯片,内置高精度比较器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率LED恒流驱动。AP5103采用ESOP8封装,散热片内置接SW脚,通过调节外置电流检测的电阻值来设置流过LED灯的电流,支持外加电压线性调光,最大电......
  • Solution of Codeforces 1957B
    DescriptionGivenintegers\(n\)and\(k\),findanon-negativesequence\(\{a_n\}\)satisfyingthefollowingconditions:1.\[\sum_{i=1}^na_i=k\]Thebinaryrepresentationof\(a_1\mida_2\mid\dots\mida_n\)hasthemaximumnumbero......
  • P3953 [NOIP2017 提高组] 逛公园
    P3953[NOIP2017提高组]逛公园求有向图中\(1\)到\(n\)的路径中长度小于等于\(dis(1,n)+k\)的方案数。\(dis(1,n)\)表示最短路。\(k\le50\)。部分分\(k=0\),直接最短路计数即可。我们发现有向图中存在后效性,不好动态规划,但我们仔细思考后,在不存在\(0\)边的情况下,设......
  • jmeter中平均响应时间中百分位90,95,99区别,应该关注哪个?
      在JMeter中,平均响应时间(AverageResponseTime)以及百分位数(Percentiles)是用来衡量性能的重要指标之一。在这些指标中,99th百分位、95th百分位和90th百分位通常被用来表示响应时间的分布情况。99th百分位(P99):表示在所有请求中,99%的请求的响应时间都小于或等于该......
  • cf1957 E. Carousel of Combinations(打表/威尔逊定理)
    https://codeforces.com/contest/1957/problem/E题意记\(Q_n^k\)为在\(n\)个数中选\(r\)个数排列成一圈的方案数,即圆排列数。求\[\sum_{i=1}^n\sum_{j=1}^iQ_i^j\\mathrm{mod}\j\]对\(10^9+7\)取余的结果。思路这种模数变来变去的题,要考虑打表。打表思路:https......
  • 力扣-495. 提莫攻击
    1.题目题目地址(495.提莫攻击-力扣(LeetCode))https://leetcode.cn/problems/teemo-attacking/题目描述在《英雄联盟》的世界中,有一个叫“提莫”的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。当提莫攻击艾希,艾希的中毒状态正好持续 duration秒。正......
  • CF1957E 做题小计 : 威尔逊定理
    被数论虐爆了(悲)威尔逊定理\(\forallp\inprime,(p-1)!\equiv-1(\bmodp)\)为什么啊?对于\(2\)很显然。对于\(p\),我们知道\(inv(p-1)=p-1=-1\),然后\(inv(1)=1\)然后因为\(p\inprime\),所以对于任意\(a\in[2,p-2]\),都有\(inv(a)\)与它唯一对应。因为\(......