暴力dfs 3699 A hard Aoshu Problem

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>

using namespace std;

int ans;
int n, t, cnt;
int B[10];
int temp[10];
int used[10];
int A[6][40000][6];
int len1, len2, len3;
char str1[10], str2[10], str3[10];
map<char, int>M;

void dfs( int index, int digit )
{
	if( index==digit )
	{
		for( int i=0;i<digit;i++ )
		A[digit][cnt][i]=temp[i];
		cnt++;
		return;
	}
	for( int i=0;i<10;i++ )
	{
		if( used[i] )
		continue;
		used[i]=1;
		temp[index]=i;
		dfs( index+1, digit );
		used[i]=0;
	}
}

void getA( int digit )
{
	for( int i=0;i<10;i++ )
	{
		memset( used, 0, sizeof( used ) );
		used[i]=1;
		temp[0]=i;
		dfs( 1, digit );
		used[i]=0;
	}
}

void cal( int a[6] )
{
    int i;
	int num1=0, num2=0, num3=0;
	for( i=0;str1[i];i++ )
	num1=num1*10+a[M[str1[i]]];
	for( i=0;str2[i];i++ )
	num2=num2*10+a[M[str2[i]]];
	for( i=0;str3[i];i++ )
	num3=num3*10+a[M[str3[i]]];
	if( num1+num2==num3 )
	ans++;
	if( num1-num2==num3 )
	ans++;
	if( num1*num2==num3 )
	ans++;
	if( num2 )
	if( num1/num2==num3 && num1%num2==0 )// 必须要整除
	ans++;
}

int main()
{
	int i,  j, k;

	for( i=1;i<=5;i++ )
    {
        cnt=0;
        getA( i );
        B[i]=cnt;
    }

	scanf( "%d", &t );
	while( t-- )
	{
		ans=0;
		M.clear();
		scanf( "%s%s%s", str1, str2, str3 );
		k=0;
		for( i=0;str1[i];i++ )
		{
            if( M.find( str1[i] )!=M.end() )
            continue;
            M[str1[i]]=k++;
		}
		for( i=0;str2[i];i++ )
        {
            if( M.find( str2[i] )!=M.end() )
                continue;
            M[str2[i]]=k++;
        }
        for( i=0;str3[i];i++ )
        {
            if( M.find( str3[i] )!=M.end() )
                continue;
            M[str3[i]]=k++;
        }

		len1=strlen( str1 );
		len2=strlen( str2 );
		len3=strlen( str3 );
		for( i=0;i<B[k];i++ )
		{
			if( A[k][i][M[str1[0]]]==0 && len1!=1  )
			continue;
			if( A[k][i][M[str2[0]]]==0 && len2!=1  )
			continue;
            if( A[k][i][M[str3[0]]]==0 && len3!=1  )
			continue;
			cal( A[k][i] );
		}
		printf( "%d\n", ans );
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值