排列组合问题 用C语言解决的
有十个位置固定盒子,现在这里有十个不同的球(1,2,3,4,5,6,7,8,9,10)要求打印出排列球放入到盒子的所有情况请问算法是什么呢、?谢谢了...
有十个位置固定盒子, 现在这里有十个不同的球( 1,2,3,4,5,6,7,8,9,10 )要求打印出排列球放入到盒子的所有情况 请问算法是什么呢、?谢谢了
展开
展开全部
使用回朔算法么~
具体实现代码如下
#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为排列的总数(我自己用来检查总数对不对用的)
具体实现代码如下
#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为排列的总数(我自己用来检查总数对不对用的)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
穷举...
希望有人能有更好的办法...
我这里有3个盒子,每个盒子里有编号的3个球1,2,3
每次拿出一个球
打印出所有球的组合...
除了3个for还有没有更好的方法?
因为...如果需要扩充...就要把整个程序都重写...
希望有人能有更好的办法...
我这里有3个盒子,每个盒子里有编号的3个球1,2,3
每次拿出一个球
打印出所有球的组合...
除了3个for还有没有更好的方法?
因为...如果需要扩充...就要把整个程序都重写...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
嵌套for循环就行啊!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询