HDU1560,迭代加深搜尋

Salvete發表於2018-08-29

第一次做迭代加深操作,看了題解之後,根據自己的理解做出來的,但是該程式還是不夠強大,比如討論中的測試資料:
1
8
AAAAA
CCCCC
TTTTT
GGGGG
CACAC
AGGGA
TTTTT
GAGGA,程式在進入到17層迭代的時候,就一直卡在那裡,不動了。由於該題資料比較水,所以還是以951Ms過了。

/*************************************************************************
    > File Name: main.cpp
    > Author:Eagles 
    > Mail:None 
    > Created Time: 2018年08月28日 星期二 20時32分32秒
    > Description:HDU1560,迭代加深搜尋 
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 9
int n;
char dna[4]={'A','C','G','T'};
char s[N][N];//記錄字串
int pos[N];//記錄每個字串已經匹配了幾個字元,初始化為0
int len[N];//記錄每個字串的長度
int deep;//迭代的深度
int ans;//最終的答案

int max(int a, int b)
{
    return a>b?a:b;
}
//返回所有字串中,還未匹配的最大長度
int left()
{
    int re=0;

    for (int i=0; i<n; i++)
        re=max(re,len[i]-pos[i]);

    return re;
}

void dfs(int layer)
{
    if (layer+left()>deep)
        return;

    if (left()==0)//如果所有未匹配的長度為0,則說明所有匹配完成
    {
        ans=layer;
        return;
    }

    for (int i=0; i<4&&(ans == -1); i++)//四個字母
    {
        int flag=0;

        int backup[N];//用作備份的陣列,如果下一層dfs不行,返回時,將pos陣列還原會dfs之前的樣子

        for (int j=0; j<n&&(ans ==-1); j++)
        {
            backup[j]=pos[j];

            if (dna[i]==s[j][pos[j]])//如果當前字串能夠匹配該字母
            {
                pos[j]++;
                flag=1;//說明當前位置的字母至少能匹配一個字串
            }
        }

        if (flag)
        {
            dfs(layer+1);

            if (ans != -1)
                return;
            for (int j=0; j<n; j++)
                pos[j]=backup[j];//回溯,講pos陣列復原
        }
    }
}

int main()
{
    int t;
    while(~scanf("%d",&t))
    {
        while(t--)
        {
            deep=0;
            int sum=0;

            scanf("%d",&n);
            for (int i=0; i<n; i++)
            {
                scanf("%s",s[i]);
                len[i]=strlen(s[i]);
                pos[i]=0;
                deep=max(deep,len[i]);
                sum+=len[i];
            }

            ans=-1while(1)
            {
                dfs(0);

                if (ans != -1)
                {
                    printf("%d\n",ans);
                    break;
                }
                deep++;

            }

        }
    }

    return 0;
}

相關文章