习题2-6排列(permutation)

Posted miaoshengyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题2-6排列(permutation)相关的知识,希望对你有一定的参考价值。

目的:用1-9九个数字组成三个三位数abc, def, ghi,每个数字恰好使用一次,求三个数abc:def:ghi = 1 : 2 : 3的所有可能

 

要求:

  输出:按照“abc def ghi”格式输出所有解

  样例输出:192 384 576

 

思路:用数组元素是否重复判断每个数字是否恰好使用一次,将abcdefghi存入数组,如果重复就说明不是解。那么就有两种思路:第一种是由数组得到匹配比例的数字解,这样就要构造循环对数组的每个位进行判断;第二种是不断对第一个数进行迭代,由比例关系得到第二个和第三个数,最后判断数字是否重复,采用了这种方法。

 

代码如下:

#include<stdio.h>

int bitSize;

int main()
{
    //Function declaration
    int inBit(int *bit, int num);

    //Local variables
    int bit[9];

    for(int i = 123; i < 333; i++){
        bit[0] = i / 100;
        bit[1] = (i / 10) % 10;
        bit[2] = i % 10;

        int status = 1;
        bitSize = 3;

        int j = 2 * i;
        int k = 3 * i;

        int temp[6];
        temp[0] = j / 100;
        temp[1] = (j / 10) % 10;
        temp[2] = j % 10;
        temp[3] = k / 100;
        temp[4] = (k / 10) % 10;
        temp[5] = k % 10;

        for(int iter = 0; iter < 6; iter++){
            if(inBit(bit, temp[iter])){//If repeated
                status = 0;
                break;
            }
            else{
                bit[bitSize++] = temp[iter];
            }
        }

        if(status){
            printf("%d %d %d
", i, j, k);
        }
    }

    return 0;
}

int inBit(int *bit, int num){//If repeated,return 1
    for(int i = 0; i < bitSize; i++){
        if(num == bit[i]){
            return 1;
        }
    }
    return 0;
}

优化:在找到对应的三个数之后循环判断是否数字重复的过程中,只要有一个重复即不是解,可以进行下一次猜数。

以上是关于习题2-6排列(permutation)的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛入门经典习题2-6 排列(permutation)

习题2-6 排列--------《竞赛算法入门指导》

算法竞赛入门经典 习题 2-10 排列(permutation)

习题2-6

排序 permutation

next_permutation 与 prev_permutation(全排列算法)