排列(permutation) 用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。

#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\n",abc,def,ghi);
        }

        // 重置count 和a数组
        count = 0;
        memset(a,0,sizeof(a));
    }

    return 0;
}


点评:这种整体的思路,以及缩小数字范围的思路很牛逼。

posted @ 2018-03-09 15:56  TBHacker  阅读(2641)  评论(0编辑  收藏  举报