HDU 3699 水爆搜

本文介绍了一道福州现场赛签到题的解题思路,通过暴力搜索的方法来找出符合特定数学运算条件的字符串组合。该算法首先检查字符串的有效性,然后计算字符串所代表的数值,并验证这些数值是否满足加法、减法、乘法或除法的关系。

10福州现场赛签到题

暴力搜索


#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"

int hash[11];
char s1[11],s2[11],s3[11];

int find(int a,int b,int c,int d,int e)
{
	__int64 aa,bb,cc;
	int num[11],i,sum;
	sum=0;
	num[1]=a;
	num[2]=b;
	num[3]=c;
	num[4]=d;
	num[5]=e;

	if (strlen(s1)!=1 && num[s1[0]-64]==0 ) return 0;
	if (strlen(s2)!=1 && num[s2[0]-64]==0 ) return 0;
	if (strlen(s3)!=1 && num[s3[0]-64]==0 ) return 0;


	aa=bb=cc=0;
	for (i=0;s1[i];i++)
		aa=aa*10+num[s1[i]-64];
	for (i=0;s2[i];i++)
		bb=bb*10+num[s2[i]-64];
	for (i=0;s3[i];i++)
		cc=cc*10+num[s3[i]-64];

	if (aa+bb==cc) sum++;
	if (aa-bb==cc) sum++;
	if (aa*bb==cc) sum++;
	if (bb!=0 && aa/bb==cc && aa%bb==0) sum++;

	return sum;
}


	



int main()
{
	int temp,k,i,n,i1,i2,i3,i4,i5,ans;
	scanf("%d",&n);

	while (n--)
	{
		getchar();
		scanf("%s%s%s",s1,s2,s3);
		memset(hash,0,sizeof(hash));

		ans=0;
		for (i1=0;i1<=9;i1++)
			if (hash[i1]==0)
			for (i2=0;i2<=9;i2++)
				if (i2!=i1 &&  hash[i2]==0)
					for (i3=0;i3<=9;i3++)
						if (i3!=i2 && i3!=i1 && hash[i3]==0 )
							for (i4=0;i4<=9;i4++)
								if (i4!=i1 && i4!=i2 && i4!=i3 && hash[i4]==0)
									for (i5=0;i5<=9;i5++)
										if (i5!=i1 && i5!=i2 && i5!=i3 && i5!=i4 && hash[i5]==0)
											ans+=find(i1,i2,i3,i4,i5);


		temp=1;

		memset(hash,0,sizeof(hash));
		for (i=0;s1[i];i++)
			hash[s1[i]-64]=1;
		for (i=0;s2[i];i++)
			hash[s2[i]-64]=1;
		for (i=0;s3[i];i++)
			hash[s3[i]-64]=1;

		k=10;
		for (i=1;i<=5;i++)
			if (hash[i]==1) k--;

		for (i=1;i<=5;i++)
			if (hash[i]==0)
			{
				temp*=k;
				k--;
			}

    

		printf("%d\n",ans/temp);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值