#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;
}
暴力dfs 3699 A hard Aoshu Problem
最新推荐文章于 2021-10-09 21:43:30 发布