蓝桥杯寒假训练二1005 DFS以及三重循环的问题出在memset不能对1进行赋值

题目大意:

请看下面的算式:
(ABCD - EFGH) * XY = 900
每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0。
比如,(5012 - 4987) * 36 就是一个解。
请找到另一个解,并提交该解中 ABCD 所代表的整数。

注意:只提交 ABCD 所代表的整数,不要写其它附加内容,比如:说明性的文字。

经典DFS

#include<iostream>
using namespace std;
int a[10]={0};
int b[10]={0};
int first=0,second=0,third=0; 
void dfs(int m)
{
	if(m==10)
	{
		first=a[0]*1000+a[1]*100+a[2]*10+a[3];
		second=a[4]*1000+a[5]*100+a[6]*10+a[7];
		third=a[8]*10+a[9];
		if((first-second)*third==900&&first>=1000&&second>=1000&&third>=10)
		{
			cout<<first<<endl;
			return;
		}
	}

	for(int i=0;i<10;i++)
	{
		if(b[i]==0) //如果说b[i]没有使用的话 
		{
			a[m]=i;
			b[i]=1;
			dfs(m+1);
			b[i]=0;	
		}
	}
	return ;
}
int main()
{
	dfs(0);
	return 0;
}

三重循环大概运行了300s 很烂的做法

找到了一个知识上的错误点 

memset这个函数的作用是将数字以单个字节朱哥拷贝的方式放到指定的内存中

所以memset(a,1,sizeof(a));

是把所有a[i]变成了   16843009

下面上代码

#include<iostream>
#include<cstring>
using namespace std;

int a[10]={0,1,2,3,4,5,6,7,8,9};//用来表示 9个不同的数 
int b[10];//用来判断是否10个数都出现了 
void  fun(int x)
{
	while(x)
	{
			b[x%10]=0;
		   	x=x/10;	    
	}
}
int main()
{
	int i,j,k;
	for(i=1000;i<=9999;i++)
	{
		for(j=1000;j<=9999;j++)
		{
			if(i>j)
			for(k=10;k<=99;k++)
			{	int flag=0;
				for(int s=0;s<=9;s++)
					b[s]=1;
				fun(i);
				fun(j);
				fun(k);
				for(int s=0;s<=9;s++)
				{
					if(b[s]==1)//看看b[]还剩下几个  
					{
					flag++;		
					}
					 
				}
				if((i-j)*k==900&&flag==0)
				cout<<i<<endl;
			}
		}
	}

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值