• 费解的开关


    问题 E: 费解的开关

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 13  解决: 7
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

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

    样例输入

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

    样例输出

    3
    2
    -1 
    

     用二进制存每个状态,然后对全是1的状态进行反向BFS,存下六步内的所有状态,用map存下这个状态,再对比就行了。

    #include <bits/stdc++.h>
    using namespace std;
     int get_map(int x,int i)
     {
        x=x^(1<<i);
        if((i%5)<4)
        {
            x=x^(1<<(i+1));
        }
        if(i%5)
        {
            x=x^(1<<(i-1));
        }
        if(i>=5)
        {
            x=x^(1<<(i-5));
        }
        if(i<20)
        {
            x=x^(1<<(i+5));
        }
        return x;
     }
     map<int,int> Map;
     void bfs()
     {
        queue<int> q;
        q.push((1<<25)-1);
        Map[(1<<25)-1]=1;
        while(!q.empty())
        {   int now=q.front();
            q.pop();
            if(Map[now]==7) return;
            for(int i=0;i<25;i++)
            {
                int nex=get_map(now,i);
                if(Map[nex]==0)
                {
                    Map[nex]=Map[now]+1;
                    q.push(nex);
                }
            }
        }
     }
    int main()
    {
        int n;
        cin>>n;
        bfs();
        while(n--)
        {
            int i,y=0,x=0;
            for(i=0;i<25;i++)
            {
                scanf("%1d",&y);
                x+=(y<<i);
            }
            cout<<Map[x]-1<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    [译]kendoui
    [LeetCode] 74 Search a 2D Matrix(二分查找)
    [LeetCode] N皇后问题
    [LeetCode] 5 Longest Palindromic Substring
    [LeetCode] 98 Validate Binary Search Tree
    [LeetCode] 119 Pascal's Triangle II
    [LeetCode] 二叉树相关题目(不完全)
    排序方法的分类和实现
    已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
    拓扑排序(附LeetCode题目)
  • 原文地址:https://www.cnblogs.com/zyf3855923/p/9265044.html
Copyright © 2020-2023  润新知