hdu3419

/*
分析:
    脑袋跟抽了似的,一道水水的深搜写了半天,
还好一次ac了,囧。。。

                                        2012-09-24
*/










#include"stdio.h"
#include"string.h"
int a,b,c;
int ans;
int hash[10];
int base[11],limit;
int t_a;
int t_b;
void judge()
{
	int i;
	int t;
	int temp[10];
	t=t_a*t_b;
	if(limit<=t || t<base[c])	return ;
	memset(temp,0,sizeof(temp));
	while(t)
	{
		if(hash[t%10])	return ;
		temp[t%10]=1;
		t/=10;
	}
	t=0;
	for(i=1;i<10;i++)	if(temp[i])	t++;
	if(t!=c)	return ;
	ans++;
}
void DFS2(int k)
{
	int i;
	if(k>=base[b+1])	return ;
	if(base[b]<=k)		{t_b=k;judge();return ;}
	for(i=1;i<10;i++)
	{
		if(hash[i]==0)
		{
			hash[i]=1;
			DFS2(k*10+i);
			hash[i]=0;
		}
	}
}
void DFS(int k)
{
	int i;
	if(k>=base[a+1])	return; 
	if(base[a]<=k)
	{
		t_a=k;
		DFS2(0);
		return ;
	}
	for(i=1;i<10;i++)
	{
		if(hash[i]==0)
		{
			hash[i]=1;
			DFS(k*10+i);
			hash[i]=0;
		}
	}
}
int main()
{
	int i;
	while(scanf("%d%d%d",&a,&b,&c),a||b||c)
	{
		if(a==0 || b==0 || c==0)	{printf("0\n");continue;}
		if(a+b-2>c)					{printf("0\n");continue;}

		base[1]=1;
		for(i=2;i<=10;i++)	base[i]=base[i-1]*10;
		limit=base[c+1];

		ans=0;
		memset(hash,0,sizeof(hash));
		DFS(0);
		printf("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(hdu3419)