• 费解的开关


     

     

     

    解题思路:每一行每一个开关是否需要操作完全由上一行灯的亮灭状态所决定。

    所以用二进制枚举第一行开关的操作情况。

    第一行灯的亮灭状态确定后,整个5*5所有灯的亮灭状态就确定了。

    因为最后一行没有下一行了,所以判断最后一行是否全为亮,若不全为亮就是不合题意。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 6;
     4 char g[N][N], bk[N][N]; //g是原始的,bk是备份
     5 int dx[5] = {-1, 0, 1, 0, 0};
     6 int dy[5] = {0, 1, 0, -1, 0}; //五个点
     7 void turn(int x, int y) {
     8     for (int i = 0; i < 5; i++) {
     9         int a = x + dx[i];
    10         int b = y + dy[i];
    11         if (a < 0 || a >= 5 || b < 0 || b >= 5) {
    12             continue;
    13         }
    14         if (g[a][b] == '0') {
    15             g[a][b] = '1';
    16         } else {
    17             g[a][b] = '0';
    18         }
    19     }
    20 }
    21 int main() {
    22     int T;
    23     cin >> T;
    24     while (T--) {
    25         for (int i = 0; i < 5; i++) {
    26             for (int j = 0; j < 5; j++) {
    27                 cin >> g[i][j];   
    28             }
    29         }
    30         int res = 20;
    31         for (int op = 0; op < (1 << 5); op++) {
    32             memcpy(bk, g, sizeof g); //把g备份入bk中
    33             int step = 0; //存储当前op这一方案的操作次数
    34             for (int i = 0; i < 5; i++) { //操作第一行
    35                 if (op >> i & 1) {
    36                     step++;
    37                     turn(0, i);
    38                 }
    39             }
    40             for (int i = 0; i < 4; i++) { //再判断前4行
    41                 for (int j = 0; j < 5; j++) {
    42                     if (g[i][j] == '0') {
    43                          step++;
    44                          turn(i + 1, j);
    45                      }
    46                 }
    47             }
    48             bool is_ok = true;
    49             for (int i = 0; i < 5; i++) { //判断第5行
    50                 if (g[4][i] == '0') {
    51                     is_ok = false;
    52                     break;
    53                 }
    54             }
    55             if (is_ok) {
    56                 res = min(res, step);
    57             }
    58             memcpy(g, bk, sizeof bk); //将g恢复原状
    59         }
    60         if (res > 6) {
    61             res = -1;
    62         }
    63         cout << res << endl;
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    CF1386C Joker
    P7486 「StOI2031」彩虹
    CF1516E Baby Ehab Plays with Permutations
    重拾莫比乌斯反演
    联合省选 2020 补题记录
    拉格朗日插值如何插出系数
    NOI Online 2021 补题
    Re:从0开始的多项式生活
    LOJ #6485. LJJ 学二项式定理
    P5591 小猪佩奇学数学
  • 原文地址:https://www.cnblogs.com/fx1998/p/13901536.html
Copyright © 2020-2023  润新知