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, 0, sizeof(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;
}
#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, 0, sizeof(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;
}