数字排列问题.指定一个列数n,如n=4,每一列由1-5的数字组成.排列的结果如下:
1 1 1 1
1 1 1 2
1 1 1 3
1 1 1 4
1 1 1 5
1 1 2 1
1 1 2 2
1 1 2 3
1 1 2 4
1 1 2 5
1 1 3 1
1 1 3 2
1 1 3 3
1 1 3 4
1 1 3 5
1 1 4 1
1 1 4 2
1 1 4 3
1 1 4 4
1 1 4 5
1 1 5 1
1 1 5 2
1 1 5 3
1 1 5 4
1 1 5 5
1 2 1 1
1 2 1 2
1 2 1 3
1 2 1 4
1 2 1 5
......
求一算法...

解决方案 »

  1.   


                int n = 4;
                int row = (int)Math.Pow(5, n);
                for (int i = 1; i <= row; i++)
                {
                    for (int j = n; j >= 1; j--)
                    {
                        int k = i % 5;
                        if (j == 1)
                        {
                            Console.Write((k == 0 ? 5 : k) + " ");
                        }
                        else
                        {
                            int l = i / (int)Math.Pow(5, j - 1);
                            if (k != 0 || i % (int)Math.Pow(5, j - 1) != 0)
                                l += 1;
                            while (l > 5)
                                l = l / 5;
                            Console.Write(l + " ");
                        }
                    }
                    Console.WriteLine();
                }
      

  2.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                createPerArray(4);
            }        static void createPerArray(int selectCount)
            {
                string[] strArray = new string[selectCount * 5];
                int k=0;
                for (int i = 1; i <= 5; i++)
                {
                    for (int j = 0; j < selectCount;j++)
                    {
                        strArray[k++] = i.ToString();
                    }                          }
                int totalCount = strArray.Length;
                int[] currentSelect = new int[selectCount];
                int last = selectCount - 1;            //付初始值
                for (int i = 0; i < selectCount; i++)
                    currentSelect[i] = i;            while (true)
                {
                    //输出部分,生成的时候从0计数,所以输出的时候+1
                    for (int i = 0; i < selectCount; i++)
                        Console.Write(" {0} ",strArray[currentSelect[i]]);                Console.WriteLine();                //如果不进位
                    if (currentSelect[last] < totalCount - 1)
                        currentSelect[last]++;
                    else
                    {
                        //进位部分
                        int position = last;                    while (position > 0 && currentSelect[position - 1] == currentSelect[position] - 1)
                            position--;                    if (position == 0)
                            return;                    currentSelect[position - 1]++;                    for (int i = position; i < selectCount; i++)
                            currentSelect[i] = currentSelect[i - 1] + 1;
                    }
                }
            }
           
        }
       
    }
    程序参考http://topic.csdn.net/u/20090220/23/e2d130d9-d7d4-4520-bec7-e78ae6ca9aff.html
      

  3.   

    只是一个10进制到n进制的转换虽然楼主在描述中加了 用1填充的干扰条件,但是本质上按lz是演示他就是5进制,至于填充1让patleft这个函数做就ok了
      

  4.   


            private void Form2_Load(object sender, EventArgs e)
            {
                    var res=    Enumerable.Range(0, 100).Select(p => string.Join("", c5(p, 5).Reverse().ToArray()).PadLeft(4, '1'));
             
             
             
                
            }        private IEnumerable<string> c5(int input,int basenum)
            {
                yield return (input % basenum+1).ToString();
                if (input / basenum >= 1)
                {
                    var list = c5(input / basenum, basenum);
                    foreach (var item in list)
                    {
                        yield return item;
                    }
                }
                
            }
      

  5.   

    用linq 的话 可以多表连接查询。 查询        static IEnumerable<string> Reset(int col)
            {
                var rows = Enumerable.Range(1, 5);
                var query = rows.Select(s => s.ToString()).ToList();
                for (var i = 0; i < col; i++)
                {
                    query = (from r1 in query
                             from r2 in rows
                             let intC = Convert.ToInt32(r1.Split(' ').ElementAt(i))
                             where intC < r2 || intC == r2
                             select string.Format("{0} {1}", r1, r2)).ToList();
                }            return query;
            }            //调用
                  var result = Reset(4);
                foreach (var item in result)
                    Console.WriteLine(item);
      

  6.   

    多了一列        static IEnumerable<string> Reset(int col)
            {
                var rows = Enumerable.Range(1, 5);
                var query = rows.Select(s => s.ToString()).ToList();
                for (var i = 0; i < col-1; i++)
                {
                    query = (from r1 in query
                             from r2 in rows
                             let intC = Convert.ToInt32(r1.Split(' ').ElementAt(i))
                             where intC < r2 || intC == r2
                             select string.Format("{0} {1}", r1, r2)).ToList();
                }            return query;
            }
      

  7.   

    LS的代码没有看,
    不过赞同3L的说法。
    LZ这个就是5进制嘛,
    只是你这个到6直接进到1,而不是0,
    做个5进制,然后怎么排列数组自己说了算了就。
    呵呵,说了下我的想法,见笑了。