AcWing 95. 费解的开关

题目 传送门
简要思路: 枚举第一行所有的操作可能性(2^5=32),之后对于每一种情况下的第一行,用第一行下方的第二行的灯来把第一行里面是0的全部变成1,一直到最后一行。由于没有下一行来改变最后一行的0,1情况,所以若此时最后一行不全为1的话,就不满足题意
Code:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>

using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int inf = 0x3f3f3f3f;
const int maxn = 10;

char mp[maxn][maxn];
char tmp[maxn][maxn];
int dx[]={0,-1,0,1,0}, dy[]={1,0,-1,0,0};//改变上下左右和自己的灯的状态
int n = 5;

void turn (int x, int y) {
    for (int i=0;i<5;i++) {
        int nx = x + dx[i], ny = y + dy[i];
        if (nx>=0&&nx<n&&ny>=0&&ny<n) {
            tmp[nx][ny] = '0' + !(tmp[nx][ny] - '0');
        }
    }
}
int get_step() {
    int step, ans = inf;

    for (int i=0;i<(1 << n);i++) {//枚举每个第一行的操作情况
        memcpy(tmp, mp, sizeof(mp));//变回原来mp[][]
        step = 0;
        for (int j=0;j<n;j++) {
            if ((i >> j) & 1) {
                turn(0, j);
                step++;
            }
        }

        for (int i=0;i<n-1;i++) {
            for (int j=0;j<n;j++) {
                if (tmp[i][j] == '0') {
                    turn(i+1, j);//按它下面的灯的开关
                    step++;
                }
            }
        }
        bool is_ok = true;
        for (int i=0;i<n;i++) {
            if (tmp[n-1][i] != '1') {
                is_ok = false;
                break;
            }
        }
        if (!is_ok)  continue;
        ans = min(ans, step);
    }
    return ans<=6?ans:-1;
}
int main()
{
    int T;
    scanf("%d", &T);
    while (T--) {
        for (int i=0;i<n;i++) {
            scanf("%s", mp[i]);
        }
        
        printf("%d\n", get_step());
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值