zoukankan      html  css  js  c++  java
  • 费解的开关

    费解的开关

    题目描述

    你玩过“拉灯”游戏吗?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个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。

    输出格式

    一共输出n

    行数据,每行有一个小于等于6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。

    对于某一个游戏初始状态,若6步以内无法使所有灯变亮,则输出“-1”。

    数据范围

    0<n≤500

    输入样例

    3
    00111
    01011
    10001
    11010
    11100
    
    11101
    11101
    11110
    11111
    11111
    
    01111
    11111
    11111
    11111
    11111
    

    输出样例

    3
    2
    -1
    

    题目思路

    第一行一共有2^23种处理方式,当第一行的处理方式确定以后,下面四行的处理方式就确定了。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N = 6;
    char g[N][N],backup[N][N];
    int dx[5] = {-1,0,1,0,0},dy[5] = {0,1,0,-1,0};
    
    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>=5||b<0||b>=5)
                continue;
            g[a][b] ^= 1;
        }
    }
    
    int main()
    {
        int T;
        cin >> T;
        while(T--)
        {
            for(int i=0;i<5;i++)cin >> g[i];
            
            int res = 7;
            for(int op=0;op<32;op++)
            {
                memcpy(backup,g,sizeof g);
                int step = 0;
                for(int i=0;i<5;i++)
                {
                    if(op>>i&1)
                    {
                        turn(0,i);
                        step ++;
                    }
                }
                
                for(int i=0;i<4;i++)
                {
                    for(int j=0;j<5;j++)
                    {
                        if(g[i][j]=='0')
                        {
                            turn(i+1,j);
                            step ++;
                        }
                    }
                }
                
                bool dark = false;
                for(int i=0;i<5;i++)
                {
                    if(g[4][i]=='0')
                    {
                        dark = true;
                        break;
                    }
                }
                
                if(!dark) res = min(step,res);
                memcpy(g,backup,sizeof backup);
            }
            
            if(res > 6) res = -1;
            
            cout << res << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    spring日记(三)
    spring日记(二)
    spring框架日记(一)
    springMVC日记(四)
    springMVC日记(三),文件上传,拦截器,数据校验
    springMVC日记(二)
    springMVC日记(一)
    Mybatis总结
    优化Dalvik虚拟机的内存分配
    简单对App进行单元测试
  • 原文地址:https://www.cnblogs.com/fsh001/p/14274627.html
Copyright © 2011-2022 走看看