本问题以解决,是用的递归函数,我们再来想想用没有其他的解决办法的???????
/*排列组合*/
/*题目:用1、2、2、3、4、5这六个数字,用C#写一个main函数,打印出所有不同的排列,*/
/*如512234、412345等。要求:"4"不能在第三位,"3"与"5"不能相连。*/
const int MAXN = 6;//排列数组的长度
static int[] Array = new int[MAXN];//用来储存1,2,2,3,4,5这六个排列的数
static int[] TemporaryArray = new int[MAXN];//用来临时储存排列好后的序列
static int[] PositionState = new int[MAXN];//用来标记各个位置的状态
static int count = 0;//用来记录符合题意的排列数长度
//打印每次排列过后的一个数
private static void Print()
{
for (int i = 0; i < MAXN; ++i)
{
Console.Write("{0}", TemporaryArray[i]);
}
Console.Write(" ");
}
//对Array[MAXN]中的数进行排列
private static void NORepeatedPermutation(int depth)
{
int i;
for (i = 0; i < MAXN; ++i)
{
if (PositionState [i] > 0)
{
--PositionState [i];
if (
!(i + 1 == 4 && depth == 2) && // 4 at position 3
!(i + 1 == 3 && depth > 0 && TemporaryArray[depth - 1] == 5) && // 53
!(i + 1 == 5 && depth > 0 && TemporaryArray[depth - 1] == 3) // 35
)
{
TemporaryArray[depth] = i + 1;
if (MAXN - 1 == depth)
{
++count;
//if (count%10 == 0)
//{
// Console.WriteLine();
//}
Print();
}
else
NORepeatedPermutation(depth + 1);
}
++PositionState [i];
}
}
}
static void Main(string[] args)
{
//初始化Array[MAXN]
Array[0] = 1;
Array[1] = 2;
Array[2] = 2;
Array[3] = 3;
Array[4] = 4;
Array[5] = 5;
for (int i = 0; i < MAXN; i++)
{
++PositionState[Array[i] - 1]; //PositionState [] 的值为:1,2,1,1,1,0
}
Console.WriteLine("The value arranged completely is :");
NORepeatedPermutation(0);
Console.WriteLine();
Console.WriteLine("Total count:{0}", count);
Console.ReadLine();
}
[此贴子已经被作者于2007-1-25 16:49:59编辑过]