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;
}

此代码有重复的情况出现,大家有没有更优雅、精准地解决问题的方法,谢谢指教

阅读 8k
1 个回答

这是一个全排列的问题嘛

#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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题