#include <stdio.h>
#include <math.h>
// 算法竞赛的目标是编程对任意输入均得到正确的结果。
// 请先独立完成,如果有困难可以翻阅本书代码仓库中的答案,但一定要再次独立完成。
// “抓住主要矛盾”——始终把学习、实验的焦点集中在最有趣的部分。如果直观地解决方案行得通,就不必追究其背后的原理。
/**
【题目】排列(permutation)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要
求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。
*/
/**
【分析】思考了半天没有思路,太难了。
*/
int main()
{
int abc,def,ghi;
int a[10],count=0;
memset(a,0,sizeof(a)); // 将a数组中的值全部设置为0
for (abc = 123;abc < 333;abc ++) { // 基本可以确定abc的最小值和最大值
def = 2 * abc;
ghi = 3 * abc;
// 设置数组中所有对应的9位数字位置的值1
a[abc/100] = 1; // a
a[abc/10%10] = 1; // b
a[abc%10] = 1; // c
a[def/100] = 1; // d
a[def/10%10] = 1; // e
a[def%10] = 1; // f
a[ghi/100] = 1; // g
a[ghi/10%10] = 1; // h
a[ghi%10] = 1; // i
int i;
for (i=1;i<=9;i++) {
count += a[i];
}
if (count == 9) {
printf("%d %d %d
",abc,def,ghi);
}
// 重置count 和a数组
count = 0;
memset(a,0,sizeof(a));
}
return 0;
}
点评:这种整体的思路,以及缩小数字范围的思路很牛逼。