题目大意:
请看下面的算式:
(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;
}