C++手動で全配列を実現

8818 ワード

全配列、つまり配列の組み合わせ
 123123 132 213 231 312 321

構想:1から始まる全配列,すなわち2,3の全配列,2,3の全配列はそれぞれ2と3から始まる全配列である.これは再帰的なプロセスです.具体的な各ステップの解析はコードの中にあります.
//
// Created by Night on 2020/7/16.
//
#include
#include

using namespace std;
int a[] = {1, 2, 3, 3};
int ans = 0;
int len = sizeof(a) / sizeof(a[0]);
/*
*         ,  check            
*   K ,      
*/
int check(int n, int i) {    //   i        n......i-1    
    if (i > n) {
        for (int j = n; j < i; ++j) {
            if (a[i] == a[j])
                return 0;
        }
    }
    return 1;   //     1
}

void perm(int k) {
    if (k == len){  //         
        for (int j = 0; j <len ; ++j) {
            printf("%d ",a[j]);
        }
        ans++;
        printf("
"
); } // K K for (int i = k; i < len; i++) { if (check(k, i)) { // swap(a[i], a[k]); // , 。 perm(k + 1); // k+1 swap(a[i], a[k]);// , } } } int main() { perm(0); printf(" %d ",ans); return 0; }