zoukankan      html  css  js  c++  java
  • UVA 12380 Glimmr in Distress --DFS

    题意:给你一串数字序列,只包含0,1,2,一路扫描过去,遇到2则新开一个2x2的矩阵,然后如果扫到0或1就将其填入矩阵,注意不能四个方格全是0或者全是1,那样跟一个方格没区别,所以21111这种是不可能的,问根据串的数字先后顺序可不可能构造一个矩阵出来,正好把数字都填完,如果可以,输出该矩阵的大小,2^n*2^n的形式输出。

    分析:其实就是递归求解,首先判断第一个数是不是2,不是则说明没有分块,所以长度必须是1,数字可以为0或1,如果是则dfs,每次遇到2,则dfs下一层,并从下一个下标开始,用flag[4]存储接下来的四个数,以判断是否出现一样的四个数。返回到第0层时,因为第一个数是2,所以j=0的时候就dfs了下去,所以全部符合的话,第0层的j+=1变为1,所以如果第0层j!=1,说明肯定有多的,返回false。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    #define N 2517
    
    char ss[N];
    int now,len,maxi;
    
    bool dfs(int dep)
    {
        now++;         //位置移动
        maxi = max(maxi,dep);
        int j = 0;
        int tag[4];
        memset(tag,-1,sizeof(tag));
        for(j=0;j<4&&now<len;j++,now++)
        {
            tag[j] = ss[now]-'0';
            if(tag[j] != 2)
                continue;
            if(!dfs(dep+1))
                return 0;
        }
        if(dep > 0)
        {
            if(tag[0] == -1 || tag[1] == -1 || tag[2] == -1 || tag[3] == -1)
                return 0;
            if(tag[0] == tag[1] && tag[0] == tag[2] && tag[0] == tag[3] && tag[0] != 2)  //四个相同的组成一个
                return 0;
        }
        else if(j != 1)  //dep == 0
            return 0;
        now--;    //位置还原
        return true;
    }
    
    int main()
    {
        int t,i;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s",ss);
            len = strlen(ss);
            if(ss[0] != '2')
            {
                if(len != 1)
                    puts("Not Possible");
                else
                    puts("2^0*2^0");
            }
            else
            {
                maxi = 0;
                now = -1;
                if(dfs(0))
                    printf("2^%d*2^%d
    ",maxi,maxi);
                else
                    puts("Not Possible");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    第七章 下
    第七章 上
    第六章 下
    第六章 上
    第五章 下
    linux 系统通过安装包安装mysql 8 步骤(非MariaDB)
    热烈庆祝博客换了新皮肤
    异常处理
    栈计算逆波兰表达式
    栈计算中缀表达式
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3859943.html
Copyright © 2011-2022 走看看