用1、2、2、3、4、5这六个数字,用C#写一个main函数(控制台程序),打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。输出格式如下:
999999
999999

解决方案 »

  1.   

    贴代码,输出了249种排列:
                  int i,j;
                int i1, i2, i3, i4, i5;
                int j1, j2, j3, j4, j5;
                int k1, k2, k3, k4, k5;
                int[] a1 ={ 1, 2, 2, 3, 4, 5 };
                int[] a2 ={ 0, 0, 0, 0, 0 };
                int[] a3 ={ 0, 0, 0, 0 };
                int[] a4 ={ 0, 0, 0 };
                int[] a5 ={ 0, 0 };
                int[] b ={ 0, 0, 0, 0, 0, 0 };
                string s;
                j1 = 0;
                for (k1 = 0; k1 <= 5; k1++)
                    if (a1[k1] == 2)
                    {
                        j1 = j1 + 1;
                        if (j1 == 2)
                            break;
                    }
                for (i1 = 0; i1 <= 5; i1++)
                {
                    if (j1==2 && k1==i1) //排除22重复
                        continue;
                    b[0]=a1[i1];
                    j = 0;
                    for (i = 0; i <= 5; i++)
                        if (i != i1)
                        {
                            a2[j] = a1[i];
                            j = j + 1;
                        }
                    j2 = 0;
                    for (k2 = 0; k2 <= 4; k2++)
                        if (a2[k2] == 2)
                        {
                            j2 = j2 + 1;
                            if (j2 == 2)
                                break;
                        }
                    for (i2 = 0; i2 <= 4; i2++)
                    {
                        if (j2 == 2 && k2 == i2) //排除22重复
                            continue;
                        b[1] = a2[i2];
                        j = 0;
                        for (i = 0; i <= 4; i++)
                            if (i != i2)
                            {
                                a3[j] = a2[i];
                                j = j + 1;
                            }
                        j3 = 0;
                        for (k3 = 0; k3 <= 3; k3++)
                            if (a3[k3] == 2)
                            {
                                j3 = j3 + 1;
                                if (j3 == 2)
                                    break;
                            }
                        for (i3 = 0; i3 <= 3; i3++)
                        {
                            if (j3 == 2 && k3 == i3) //排除22重复
                                continue;
                            b[2] = a3[i3];
                            j = 0;
                            for (i = 0; i <= 3; i++)
                                if (i != i3)
                                {
                                    a4[j] = a3[i];
                                    j = j + 1;
                                }
                            j4 = 0;
                            for (k4 = 0; k4 <= 2; k4++)
                                if (a4[k4] == 2)
                                {
                                    j4 = j4 + 1;
                                    if (j4 == 2)
                                        break;
                                }
                            for (i4 = 0; i4 <= 2; i4++)
                            {
                                if (j4 == 2 && k4 == i4) //排除22重复
                                    continue;
                                b[3] = a4[i4];
                                j = 0;
                                for (i = 0; i <= 2; i++)
                                    if (i != i4)
                                    {
                                        a5[j] = a4[i];
                                        j = j + 1;
                                    }
                                j5 = 0;
                                for (k5 = 0; k5 <= 1; k5++)
                                    if (a5[k5] == 2)
                                    {
                                        j5 = j5 + 1;
                                        if (j5 == 2)
                                            break;
                                    }
                                for (i5 = 0; i5 <= 1; i5++)
                                {
                                    if (j5 == 2 && k5 == i5) //排除22重复
                                        continue;
                                    b[4]=a5[i5];
                                    if (i5 == 0)
                                    {
                                        b[5] = a5[1];
                                    }
                                    else
                                    {
                                        b[5] = a5[0];
                                    }
                                    if (b[2] == 4) //排除4在第3位
                                    {
                                    }
                                    else
                                    {
                                        s = b[0].ToString() + b[1].ToString() + b[2].ToString() + b[3].ToString() + b[4].ToString() + b[5].ToString();
                                        if (s.IndexOf("35") > -1) //排除35在一起
                                        {
                                        }
                                        else
                                        {
                                            Console.Write(s + "\r\n");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
      

  2.   

    谢谢大家。其实这道题我做出了一半,但是现在有一个地方实现不了。
    class Program
        {
           
            public static ArrayList list= new ArrayList();
            static void Main(string[] args)
            {
                string str = "122345";
                Sort("",str);
                foreach (int m in str)
                    Console.WriteLine("{0}", m);
            }        private static void Sort(string p, string str)
            {
                 if (p.Length != str.Length) 
                 {
                String rest = getRest(p, str);
                for (int i = 0; i < rest.Length; i++) 
                               {
                    String temp = str + rest.Substring(i, i + 1);
                    if (temp.IndexOf("4") != 2 && temp.IndexOf("35") == -1 && temp.IndexOf("53") == -1) {// 过滤显示条件,如果去掉此处的判断,就是列出所有字符集的排列组合
                                        Console.WriteLine(temp);
                        if (!list.Contains(temp))
                                                {
                            list.Add(temp);
                                                }
                        Sort(temp, str);
                    }
                }
                 }
            }
        private static string getRest(string p,string str)
    {
        String rest = "";
        if (str.Length > p.Length)
        {
            rest = str;
            for (int i = 1; i < str.Length; i++)
            {
                //rest = rest.Replaceirst(str.Substring(i, i + 1), "");
                //rest = rest.Replace(rest.IndexOf(p), str.Substring(i, i + 1));
                //rest=(rest.Remove(rest.IndexOf('1'),1)).Insert(rest.IndexOf('1'),"");            rest = (rest.Remove(str.IndexOf('i'), i + 1)).Insert(rest.IndexOf('i'), "");        }
        }
        return rest;
      

  3.   

    就是红色的那个地方出现异常。说StartIndex 不能小于 0。
    参数名: startIndex不知道改如何处理这道题。谢谢大家帮忙。
    拜托
      

  4.   

    我上面的代码如果你要加排除53相连,去掉53的输出还有198种排列。
    把这句:
      if (s.IndexOf("35") > -1) //排除35在一起
    改为:
      if (s.IndexOf("35") > -1 || s.IndexOf("53")>-1) //排除35 53在一起
      
    看了下你的算法问题不少,加个判断去掉那个错误,结果也是不正确的(算法逻辑有点问题)。你可以把你的思路,每个子函数的功能备注出来,这样才能帮你处理。还有不用判断22的重复吗? 6个数字生成的排列,其中2个2(数字相同)会导致部分输出是重复的。