HDU2585

Problem: Hotel
Description: 一个人住酒店。但是他忘记门牌号码了,现在给出一个他模糊记得的门牌号字符串,这个字符串包含‘* ’,‘?’,‘a-z’。‘* ’表示零个或多个字符,而‘?’表示一个任意的字母。现在给出多个候选项,让你找出有几个符合这个人的门牌号的。
Solution: 递归。我们抓住‘* ’这个字符。这个字符可以让我们得出一个比原问题更小的解结构。比如我们比较“* hh”和“flushhip”,遇到‘* ’我们就比较星号后的‘hh’和“flushhip”、“lushhip”、“ushhip”、“shhip”、“hhip”等等。递归结束的条件是当模式串走到尽头。
Code(C++):

#include <stdio.h>
#include <string.h>

const int M=55;

char tag[M];
char str[M];

int flag_len;

bool work(int start_tag,int start_str,int len)
{
    if(start_tag==flag_len&&start_str==len)
        return true;
    switch(tag[start_tag]){
    case '*':
        if(start_tag+1==flag_len)
            return true;
        for(int i=start_str;i<len;i++)
            if(work(start_tag+1,i,len))
                return true;
        return false;

    case '?':
        return work(start_tag+1,start_str+1,len);

    default:
        return tag[start_tag]==str[start_str]? work(start_tag+1,start_str+1,len):false;
    }
}

int main()
{
    while(~scanf("%s",tag)){

        flag_len=strlen(tag);

        int n;
        int ans=0;
        for(scanf("%d",&n);n--;){
            scanf("%s",str);
            ans+=work(0,0,strlen(str))? 1:0;
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(递归)