Reimpreso: Resumen de los temas de la 7ma Copa Blue Bridge en 2016
http://blog.csdn.net/qq_34202873/article/details/79646517
Fórmula de imputación
这个算式中A~I代表1~9的数字,不同的字母代表不同的数
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
¿Cuántas soluciones hay en esta fórmula?
Nota: Su envío debe ser un número entero, no complete ningún contenido adicional o texto explicativo.
Respuesta: 29
Idea para resolver problemas: arreglo completo del 1 al 9, estaba pescando demasiado, no se me ocurrió
Método uno (fácil de pensar): use la función next_permutation () en C ++ para organizar todos los 1-9
Cuando se usa la función de permutación completa, los elementos de la matriz deben ordenarse de pequeños a grandes. Use la estructura do while para generar todas las permutaciones. La permutación inicial que usa la estructura while no se generará. Si los elementos de la matriz no se ordenan de pequeños a grandes , no pueden mostrar todos. Permutación completa
Método dos (velocidad rápida): solución transversal en profundidad (disposición completa de 1 a 9)
方法1:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
double a[10]={0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
int ans=0;
double left;
do
{
//也可以用数组输出全排列,前提数组内元素不多,不然输出的数量太多了
left=a[1]+a[2]/a[3]+(a[4]*100+a[5]*10+a[6])/(a[7]*100+a[8]*10+a[9]);
if(left==10.0)
ans++;
}while(next_permutation(a+1,a+10));//注意这里是+10,而不是+9
printf("%d\n",ans);
return 0;
}
方法2:
#include<stdio.h>
#include<algorithm>
using namespace std;
double a[10];
int book[10],sum;
void dfs(int step)
{
int i;
if(step==10)
{
if(a[1]+a[2]/a[3]+(a[4]*100+a[5]*10+a[6])/(a[7]*100+a[8]*10+a[9])==10.0)
sum++;
return;
}
for(i=1;i<=9;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
return;
}
int main()
{
sum=0;
dfs(1);
printf("%d\n",sum);
return 0;
}