무한 나무 2023. 2. 9. 21:12

순열 (Permutation)

void Permutation(vector<char>& source, int R, int start)	// nPr
{
    if (start >= R)
    {
        for (int i = 0; i < R; i++)
        {
            cout << source[i];
        }
        cout << endl;
    }
    else
    {
        for (int i = start; i < source.size(); i++)
        {
            swap(source[start], source[i]);
            P(source, R, start + 1);
            swap(source[i], source[start]);
        }
    }
}

 

조합 (Combination)

void Combination(vector<char>& source, int R, int start,int idx)	// nCr
{
    if (start >= R)
    {
        for (int i = 0; i < R; i++)
        {
            cout << source[i];
        }
        cout << endl;
    }
    else
    {
        for (int i = idx; i < source.size(); i++)
        {
            swap(source[start], source[i]);
            C(source, R, start+1, i+1);
            swap(source[i], source[start]);
        }
    }
}

 

중복 조합

void Dupli_C(vector<char>& source, int R, int start, int idx)
{
    static vector<char> temp(source.size());

    if (start >= R)
    {
        for (int i = 0; i < R; i++)
        {
            cout << temp[i];
        }
        cout << endl;
    }
    else
    {
        for (int i = idx; i < source.size(); i++)	//중복 순열 일땐, i=0 으로 바꾸면 됨
        {
            temp[start] = source[i];
            Dupli_C(source, R, start + 1, i);
        }
    }
}