ICode9

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

AcWing 95. 费解的开关

2022-02-27 15:13:39  阅读:185  来源: 互联网

标签:cnt int backup 费解 ++ ans AcWing 95 op


 

 

 

 

 

 我们可以通过枚举第一行的每一种状态,然后后一行的状态只能由前面一行确定,这样就可以找到对应的最小步数。

我的Acwing里的题解:

开始给我看懵了,一直不理解下面这行代码

for(int i = 0; i < 5; i++)
    if(op >> i & 1)
    {
        turn(0, i);
        cnt++;
    }

y总视频里也是一笔带过,很多题解里面也是没有说明为什么 op >> i & 1 就开灯。
难道 !(op >> i & 1) 就不能开灯了? 我一直在纠结却一直没有用实际行动去证明。
最后看了好多题解之后,我忍无可忍,还是动手操作了一下,发现也是可以的。
我恍然大悟,其实op >> i & 1 可以说是一个规定,规定第i位是1的,就开灯,所以我也可以规定是0的就开灯。
难道不是吗? 很多题解都没有说明这一点,我不知道他们是否真的知道这行代码的含义,但是我开始真的不知道,所以我不可能含糊的过去。

#include <cstring>
#include <cstdio>
using namespace std;
char g[5][5], backup[5][5];
int dx[5] = {-1, 0, 1, 0, 0}, dy[5] = {0, 1, 0, -1, 0};
int n;

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 > 4 || b < 0 || b > 4) continue;
        backup[a][b] ^= 1;
    }
}
int main()
{
    scanf("%d", &n);

    while(n--)
    {
        for(int i = 0; i < 5; i++)
            scanf("%s", &g[i]);

        int ans = 7;

        for(int op = 0; op < 32; op++)
        {
            int cnt = 0;

            memcpy(backup, g, sizeof backup);

            for(int i = 0; i < 5; i++)
            {
                if(!(op >> i &1))
                {
                    turn(0, i);
                    cnt++;
                }
            }

            for(int i = 0; i < 4; i++)
                for(int j = 0; j < 5; j++)
                    if(backup[i][j] == '0')
                    {
                        turn(i+1, j);
                        cnt++;
                    }

            bool success = true;

            for(int i = 0; i < 5; i++)
                if(backup[4][i] == '0')
                    success = false;

            if(success && ans > cnt) ans = cnt;
        }

        if(ans > 6) ans = -1;

        printf("%d\n", ans);
    }

    return 0;
}

标签:cnt,int,backup,费解,++,ans,AcWing,95,op
来源: https://www.cnblogs.com/MoonSkyy/p/15942366.html

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

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

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

ICode9版权所有