zoukankan      html  css  js  c++  java
  • Vijos 1197

    描述

    你玩过“拉灯”游戏吗?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

    样例输入1

    3
    00111
    01011
    10001
    11010
    11100

    11101
    11101
    11110
    11111
    11111

    01111
    11111
    11111
    11111
    11111
    Copy
    样例输出1

    3
    2
    -1
    Copy
    限制

    各个测试点1s
    来源

    Matrix67原创
    .
    .
    .
    .
    .

    分析

    在这里,我们可以发现,每个位置也就点击一次,而且,固定第一行后,最多只有一种可行方案。由此,我们可以枚举第一行的32种情况,之后通过递推,找到最终状态,递推结束,只需检验最后一行是否合法即可。
    .
    .
    .
    .
    .

    程序:
    #include<iostream>
    #include<string.h>
    using namespace std;
    int a[5][5],b[5][5];
    char str[6];
    
    void change(int x,int y)
    {
        b[x][y]^=1;
        if (x>0) b[x-1][y]^=1;
        if (x+1<5) b[x+1][y]^=1;
        if (y>0) b[x][y-1]^=1;
        if (y+1<5) b[x][y+1]^=1;
    }
    
    int work(int f1)
    {
        int i,j,r=0;
        for (j=0;j<5;j++)
        {
            if (f1&(1<<j))
            {
                r++;
                change(0,j);
            }
        }
        for (i=1;i<5;i++)
        {
            for (j=0;j<5;j++)
            {
                if (b[i-1][j]==0)
                {
                    if (++r>=7)
                    {
                        return 7;
                    }
                    change(i,j);
                }
            }
        }
        for (j=0;j<5;j++)
        {
            if (b[4][j]==0)
            {
                return 7;
            }
        }
        return r;
    }
    
    int main()
    {
        int n;
        cin>>n;
        for (int w=1;w<=n;w++)
        {
            int step=99999;
            for (int i=0;i<5;i++)
            {
                cin>>str;
                for (int j=0;j<5;j++)
                a[i][j]=str[j]-'0';
            }
            int j;
            for (int i=0;i<32;i++)
            {
                memcpy(b,a,sizeof(b));
                j=work(i);
                if (j<step) step=j;
            }
            if (step<7) cout<<step<<endl;else cout<<-1<<endl;
        }
        return 0;
    }
  • 相关阅读:
    如何搭建ssh服务?
    安利三款提升幸福感的chrome插件
    EF6学习笔记七:代码迁移
    EF6学习笔记六:实体拆分(Entity Spliting)实现TPT、表拆分(Table Spliting)实现TPH
    EF6学习笔记五:继承三策略
    EF6学习笔记四:一对多、多对多、一对一关系配置(Fluent API)
    EF6学习笔记三:全局约定和自定义约定,整理并记下来
    EF6学习笔记二:一些详细配置,开始设计一个稍微能用的数据模型
    EF6学习笔记一:code-first简单创建数据库、表的一些过程
    Spring Cloud微服务实战 打造企业级优惠券系统 2-9 Spring Data JPA
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499913.html
Copyright © 2011-2022 走看看