枚举算法又叫做穷举算法。
□□□+□□□=□□□,将数字1-9分别填入9个□中,每个数字只能使用一次使得等式成立。
暴力穷举法:
#include <stdio.h>
#include <iostream>
int main()
{
int a, b, c, d, e, f, g, h, i, total = 0;
for (a = 1; a <= 9;a++)
for (b = 1; b <= 9; b++)
for (c = 1; c <= 9; c++)
for (d = 1; d <= 9; d++)
for (e = 1; e <= 9; e++)
for (f = 1; f <= 9; f++)
for (g = 1; g <= 9; g++)
for (h = 1; h <= 9; h++)
for (i = 1; i <= 9; i++)
{
//接下来是判断的条件是每一位上的数都不相等
if (a != b&&a != c&&a != d&&a != e&&a != f&&a != g&&a != h&&a != i
&&b != c&&b != d&&b != e&&b != f&&b != g&&b != h&&b != i
&&c != d&&c != e&&c != f&&c != g&&c != h&&c != i
&&d != e&&d != f&&d != g&&d != h&&d != i
&&e != f&&e != g&&e != h&&e != i
&&f != g&&f != h&&f != i
&&g != h&&g != i
&&h != i
&&a * 100 + b * 10 + c + d * 100 + e * 10 + f == g * 100 + h * 10 + i)
{
total++;
printf("%d%d%d+%d%d%d = %d%d%d\n", a, b, c, d, e, f, g, h, i);
}
}
printf("total = %d\n", total / 2);
system("pause");
return 0;
}
标记法:用一个Book数组来解决互不相等的问题。
#include <stdio.h>
#include <iostream>
int main()
{
int a[10],i,total = 0,book[10],sum;
//这里用a[1]-a[9]来代替刚才的a,b,...,i
for (a[1] = 1; a[1] < 10; a[1]++)
for (a[2] = 1; a[2] < 10; a[2]++)
for (a[3] = 1; a[3] < 10; a[3]++)
for (a[4] = 1; a[4] < 10; a[4]++)
for (a[5] = 1; a[5] < 10; a[5]++)
for (a[6] = 1; a[6] < 10; a[6]++)
for (a[7] = 1; a[7] < 10; a[7]++)
for (a[8] = 1; a[8] < 10; a[8]++)
for (a[9] = 1; a[9] < 10; a[9]++)
{
for (i = 1; i <= 9; i++)
book[i] = 0;
for (i = 1; i <= 9;i++)//如果某个数出现过就标记一下
{
book[a[i]] = 1;
}
//统计共出现了多少个不同的数
sum = 0;
for (i = 1; i <= 9; i++)
sum += book[i];
//如果正好出现了9个不同的数,并且满足等式条件,则输出
if (sum == 9 && a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] == a[7] * 100 + a[8] * 10 + a[9])
{
total++;
printf("%d%d%d+%d%d%d = %d%d%d\n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]);
}
}
printf("total = %d\n", total / 2);
system("pause");
return 0;
}