排列组合问题 用C语言解决的

有十个位置固定盒子, 现在这里有十个不同的球( 1,2,3,4,5,6,7,8,9,10 )要求打印出排列球放入到盒子的所有情况 请问算法是什么呢、?谢谢了

第1个回答  2009-04-29
使用回朔算法么~
具体实现代码如下
#include <stdio.h>
#include <iostream>

using namespace std;

#define iCount 10

int iv_Num[iCount];
float fDebug;

void algorithm(int iNum[iCount], int iNow);

bool judge(int iNum[iCount]);

void Sort(int iNum[iCount]);

void main()
{
for(int i=0;i<iCount;i++)
iv_Num[i]=0;
fDebug = 0;
algorithm(iv_Num, 0);
cout<<fDebug<<endl;
system("pause");
}

void algorithm(int iNum[iCount], int iNow)
{
int iTemp;
int j;
iTemp = iNum[iNow];
if(iNow>iCount-1)
{
for(int iOut=0; iOut<iCount; iOut++ )
cout<<iNum[iOut]<<"\t";
cout<<endl;
fDebug++;
iNum[iNow-1] = iTemp;
}
else
{
for(j=1; j<iCount+1; j++)
{
iNum[iNow] = j;
if(judge(iNum))
{
algorithm(iNum, iNow+1);
iNum[iNow] = iTemp;
}
else
iNum[iNow] = iTemp;
}
}
}

bool judge(int iNum[iCount])
{
int iBuffer[iCount];
for(int iN=0; iN<iCount; iN++)
iBuffer[iN] = iNum[iN];
Sort(iBuffer);
for(int i=0;i<iCount-1;i++)
{
if(iBuffer[i] == 0)
continue;
else if(iBuffer[i] == iBuffer[i+1])
return false;
}
return true;
}

void Sort(int iNum[iCount])
{
int iTemp;
for(int i=0;i<iCount;i++)
{
for(int j=i+1;j<iCount;j++)
{
if(iNum[i]>iNum[j])
{
iTemp = iNum[i];
iNum[i] = iNum[j];
iNum[j] = iTemp;
}
}
}
}

更改iCount的宏定义 就可以算其他数量的排列了
fDebug为排列的总数(我自己用来检查总数对不对用的)本回答被提问者采纳
第2个回答  2009-04-29
穷举...
希望有人能有更好的办法...

我这里有3个盒子,每个盒子里有编号的3个球1,2,3
每次拿出一个球
打印出所有球的组合...

除了3个for还有没有更好的方法?
因为...如果需要扩充...就要把整个程序都重写...
第3个回答  2009-04-29
嵌套for循环就行啊!
第4个回答  2009-04-29
用枚举树

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网