题目描述:
ABCD
* E
DCBA
按以上格式输出ABCDE的值(A!=B&&A!=C&&A!=D&&A!=E&&B!=C&&B!=D&&B!=E&&C!=D&&C!=E&&D!=E)。
解题思路:
看到这道题之后,许多人想到的是枚举,就像这样:
#include<iostream>
using namespace std;
int main()
{
for(int A=1;A<10;A++) //首位不为0
for(int B=0;B<10;B++)
for(int C=0;C<10;C++)
for(int D=1;D<10;D++) //首位不为零
for(int E=1;E<10;E++) //首位不为零
if((A*1000+B*100+C*10+D)*E==D*1000+C*100+B*10+A&&A!=B&&A!=C&&A!=D&&A!=E&&B!=C&&B!=D&&B!=E&&C!=D&&C!=E&&D!=E)
cout<<A<<B<<C<<D<<endl<<"* "<<E<<endl<<"----"<<endl<<D<<C<<B<<A<<endl;
}
或者这样:
#include<iostream>
using namespace std;
int main()
{
for(int num=1000;num<10000;num++) //列举ABCD
for(int E=1;E<10;E++)
{
int A=num/1000,B=num/100%10,C=num/10%10,D=num%10; //定义A,B,C,D
if(num*E==D*1000+C*100+B*10+A&&A!=B&&A!=C&&A!=D&&A!=E&&B!=C&&B!=D&&B!=E&&C!=D&&C!=E&&D!=E&&A&&D)
cout<<A<<B<<C<<D<<endl<<"* "<<E<<endl<<"----"<<endl<<D<<C<<B<<A<<endl;
}
}
也可以 首先运用全排列的思想编写dfs函数,接着编写check函数来判断是否满足条件和最高位不为0,最后定义output函数输出。
实现代码:
#include<iostream>
using namespace std;
void dfs(int ); //全排列函数
void check(void); //判断函数
void output(void); //输出函数
int num[6]; //存储A、B、C、D、E
int number1,number2; //存储前后两个四位数的值
bool flag[10]; //标记数字
main()
{
dfs(1);
}
void dfs(int x)
{
for(int i=0;i<10;i++)
if(!flag[i])
{
num[x]=i; //赋值
flag[i]=1; //标记该数字
if(x==5) check(); //若已给A、B、C、D、E赋值,则判断
else dfs(x+1); //下一轮搜索
flag[i]=0; //回溯
/*num[x]=0;*/ //可省略不写
}
}
void check()
{
if(!num[1]||!num[4]||!num[5]) return ; //若最高位为0,不执行output()
number1=num[1]*1000+num[2]*100+num[3]*10+num[4]; //赋值
number2=num[4]*1000+num[3]*100+num[2]*10+num[1]; //赋值
if(number1*num[5]==number2) output(); //判断
}
void output()
{
cout<<number1<<endl<<"* "<<num[5]<<endl<<"----"<<endl<<number2<<endl;
}
总结:
像这样的题,我们可以利用全排列的思想来解决,这种思想可以解决许多题。
触类旁通:
编程爱我
+ 我爱编程
我们爱编程
|