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
原文地址:https://www.cnblogs.com/whatbeg/p/3859943.html