鍍金池/ 問答/C  C++/ C++ 列舉出排列組合的所有可能情況。

C++ 列舉出排列組合的所有可能情況。

已知有五個白球,十個黑球,將這十五個球放成一條直線,要求列舉出所有可能的組合方式。

#define WHITE   1
void zuhe(int nowNum,int *pbuf)
{
    int i,tmp,j,n;

    int baceBuf[15],nextBuf[15];

    memcpy(baceBuf,pbuf,15*sizeof(int));
    memset(nextBuf,0,15*sizeof(int));
    for(i=0;i<=nowNum;i++){//有nowNum+1個空位,i是幾就是把這個insert插入到哪個空位
        tmp=0;
        for(j=0;j<i;j++){
            nextBuf[j]=baceBuf[tmp++];
        }

        nextBuf[j++]=WHITE;

        while(j<=nowNum){
            nextBuf[j++]=baceBuf[tmp++];
        }

        if(nowNum==11){
            for(n=0;n<15;n++){
                cout<<nextBuf[n]<<" ";
            }
            cout<<endl;
        }else{
            zuhe(nowNum+1,nextBuf);
        }

    }
}

int main(void)
{
    int cache[15];
    memset(cache,0,15*sizeof(int));
    zuhe(10,cache);
    return 0;
}

此代碼有重復(fù)的情況出現(xiàn),大家有沒有更優(yōu)雅、精準(zhǔn)地解決問題的方法,謝謝指教

回答
編輯回答
局外人

這是一個全排列的問題嘛

#include <iostream>  
#include <algorithm>
#include <vector>
#include <string>
using namespace std;  
int main()  
{  
    string color[2] = {"黑","白"};
    vector<int> vec = {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1};  
    do {  
       for(auto& i:vec){
          cout<<color[i]<<',';
       }
       cout<<endl;
    } while(next_permutation(vec.begin(),vec.end()));  
    return 0;
}
2018年8月21日 05:07