• AcWing 费解的开关 二进制枚举


     

     

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

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

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

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

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 6;
     4 char g[N][N], bk[N][N]; 
     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         g[a][b] ^= 1;
    15     }
    16 }
    17 int main() {
    18     int T;
    19     cin >> T;
    20     while (T--) {
    21         for (int i = 0; i < 5; i++) {
    22             cin >> g[i];
    23         }
    24         int res = 10;
    25         for (int op = 0; op < 32; op++) {
    26             memcpy(bk, g, sizeof g);
    27             int step = 0;
    28             for (int i = 0; i < 5; i++) {
    29                 if (op >> i & 1) {
    30                     step++;
    31                     turn(0, i);
    32                 }
    33             }
    34             for (int i = 0; i < 4; i++) {
    35                 for (int j = 0; j < 5; j++) {
    36                     if (g[i][j] == '0') {
    37                          step++;
    38                          turn(i + 1, j);
    39                      } 
    40                 }
    41             }
    42             bool flag = false;
    43             for (int i = 0; i < 5; i++) {
    44                 if (g[4][i] == '0') {
    45                     flag = true;
    46                     break;
    47                 }
    48             }
    49             if (!flag) {
    50                 res = min(res, step);
    51             }
    52             memcpy(g, bk, sizeof bk);
    53         }
    54         if (res > 6) {
    55             res = -1;
    56         }
    57         cout << res << endl;
    58     }
    59     return 0;
    60 }
  • 相关阅读:
    Oracle分页SQL
    CentOS7下安装Anaconda3
    Alibaba分层领域模型规约
    java的continue标签
    SQLserver 及 redis 无法连接问题
    HTTP状态码
    java命令功能
    sql 查询结果自增序号
    Viewpage实现左右无限滑动
    Android OOM 问题的总结
  • 原文地址:https://www.cnblogs.com/fx1998/p/12767815.html
Copyright © 2020-2023  润新知