DFS练习,2932ms险过。

CODE:

 

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;

int digit[31], save[31];
int beg, end;
int flag;

int check(int *digit, int m)
{
    int ans = 0;
    for(int i = 1; i <= m; i++)
        ans = (ans*10 + digit[i]) % m;
    if(!ans) return 1;
        return 0;
}

void dfs(int *digit, int m)
{
    if(m > end)
    {
        flag = 1;
        memcpy(save, digit, sizeof(save));
        return ;
    }
    for(int i = 0; i <= 9 && !flag; i++)
    {
        digit[m] = i;
        if(digit[1] != 0)
        {
            if((check(digit, m) && m >= beg) || m < beg)    //顺序由小到大。 
            {
                dfs(digit, m+1);
            }
        }
    }
}


int main()
{
    int T, times = 0;
    scanf("%d", &T);
    while(T--)
    {
        flag = 0;
        memset(digit, 0sizeof(digit));
        scanf("%d%d", &beg, &end);
        dfs(digit, 1);
        printf("Case %d: ", ++times);
        if(!flag) printf("-1\n");
        else
        {
            for(int i = 1; i <= end; i++)
                printf("%d", save[i]);
            printf("\n");
        }
    }
    return 0;
}

 

 

 

posted on 2012-09-25 20:58  有间博客  阅读(157)  评论(0编辑  收藏  举报