• TyvjP1266 费解的开关


    P1266 费解的开关
    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

        你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
        我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。下面这种状态

    10111
    01101
    10111
    10000
    11011

        在改变了最左上角的灯的状态后将变成:

    01111
    11101
    10111
    10000
    11011

        再改变它正中间的灯后状态将变成:

    01111
    11001
    11001
    10100
    11011

        给定一些游戏的初始状态,编写程序判断游戏者是否可能在6步以内使所有的灯都变亮。

    输入格式

        第一行有一个正整数n,代表数据中共有n个待解决的游戏初始状态。
        以下若干行数据分为n组,每组数据有5行,每行5个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。
        对于30%的数据,n<=5;
        对于100%的数据,n<=500。

    输出格式

        输出数据一共有n行,每行有一个小于等于6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。
        对于某一个游戏初始状态,若6步以内无法使所有灯变亮,请输出“-1”。

    测试样例1

    输入

    3
    00111
    01011
    10001
    11010
    11100

    11101
    11101
    11110
    11111
    11111

    01111
    11111
    11111
    11111
    11111

    输出

    3
    2
    -1

    备注

    Matrix67原创
     
    【题解】
     
    枚举第一行转法,可以确定后三行,判断第五行是否全为0
     1 #include <bits/stdc++.h>
     2 
     3 inline void read(int &x)
     4 {
     5     x = 0;char ch = getchar();
     6     char c = ch;
     7     while(ch > '9' || ch < '0')c = ch, ch = getchar();
     8     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
     9     if(c == '-')x = -x;
    10 }
    11 inline int min(int a, int b){return a > b ? b : a;}
    12 
    13 const int INF = 0x3f3f3f3f; 
    14 const int MAXN = 50 + 10;
    15 
    16 int g[MAXN][MAXN],n,ans,tmp[MAXN][MAXN];
    17 
    18 void change(int x, int y)
    19 {
    20     tmp[x][y] ^= 1;
    21     if(x - 1)
    22         tmp[x - 1][y] ^= 1;
    23     if(y - 1)
    24         tmp[x][y - 1] ^= 1;
    25     if(y + 1 <= n)
    26         tmp[x][y + 1] ^= 1;
    27     if(x + 1 <= n)
    28         tmp[x + 1][y] ^= 1;
    29 }
    30 
    31 int t;
    32 char s[MAXN];
    33 
    34 int main()
    35 {
    36     read(t);
    37     n = 5;
    38     for(;t;--t)
    39     {
    40         memset(g, 0, sizeof(g));
    41         memset(tmp, 0, sizeof(tmp));
    42         ans = INF;
    43         for(int i = 1;i <= n;++ i)
    44         {
    45             scanf("%s", s + 1);
    46             for(int j = 1;j <= n;++ j)
    47                 g[i][j] = (s[j] - '0') ^ 1;
    48         }
    49         for(register int s = 0;s < (1 << n);++ s)
    50         {
    51             for(int i = 1;i <= n;++ i)
    52                 for(int j = 1;j <= n;++ j)
    53                     tmp[i][j] = g[i][j];
    54             bool ok = true;
    55             register int tmp = s;
    56             register int k = 1;
    57             int cnt = 0;
    58             while(tmp)
    59             {
    60                 if(tmp & 1)
    61                     change(1, k),++ cnt;
    62                 ++ k;tmp >>= 1;
    63             }
    64             for(register int j = 2;j <= n;++ j)
    65                 for(k = 1;k <= n;++ k)
    66                     if(::tmp[j - 1][k])
    67                         change(j, k), ++ cnt;
    68             for(register int j = 1;j <= n;++ j)
    69                 if(::tmp[n][j])
    70                     ok = false;
    71             if(ok)
    72                 ans = min(ans, cnt);
    73         }
    74         if(ans > 6)
    75             printf("-1
    ");
    76         else printf("%d
    ", ans);
    77     }
    78     return 0;
    79 }
    View Code
  • 相关阅读:
    spark on yarn 无法提交任务问题
    git rebase 操作撤销
    vim 删除屏蔽行
    mysql 登录远程数据库 失败
    springboot拦截器中获取配置文件值
    根据经纬度获取地址 :位置名称 区 市 省 国家 邮编
    element-ui upload组件上传
    java读写excel文件( POI解析Excel)
    easyui+themeleaf 分页查询实现
    java生成二维码
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/7137752.html
Copyright © 2020-2023  润新知