现有数组a ,想将a中元素往N个数组中存放。要求是每次从a中取出n个元素,这n个元素乱序插入到n个数组中,这n个数组中每次只能放入一个元素,一直到a中元素分配完成。
比如说:
A:{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
n=5;
每次取5个元素,则得到:a1{1,2,3,4,5};a2{6,7,8,9,10};a3{11,12,13,14,15};将a1,a2,a3元素打乱顺序放入另外5个数组里,要求得到下面结果:
b:{3,8,14};
c:{4,6,12};
d:{2,10,11};
e:{1,7,15};
f:{5,9,13};
希望大家多指教,最好写段代码让我看下,我已经困惑好长时间了,写不出来;
随便写了一个
private static void _20140626f1() { Console.Write("数组A(输入长度后回车):"); int maxlen = int.Parse(Console.ReadLine()); List<int> a = new List<int>(); for (int i = 0; i < maxlen; i++) { a.Add(i + 1); } Console.Write("取数n(输入后回车):"); int n = int.Parse(Console.ReadLine()); List<List<int>> b = new List<List<int>>(); for (int i = 0; i < n; i++) { b.Add(new List<int>()); } int tempn = maxlen % n == 0 ? maxlen / n : (maxlen / n + 1); for (int i = 0; i < tempn; i++) { List<int> c = new List<int>(); for (int j = 0; j < n; j++) { c.Add(j); } for (int j = i * n; j < (i + 1) * n; j++) { if (j < maxlen) { Random rd = new Random(i); int temprd = rd.Next(0, c.Count); if (temprd == c.Count) temprd -= 1; int k = c[temprd]; while (b[k].Count > i) { temprd = rd.Next(0, c.Count); if (temprd == c.Count) temprd -= 1; k = c[temprd]; } b[k].Add(j + 1); c.Remove(k); } } } for (int i = 0; i < n; i++) { Console.Write("数组" + (i + 1) + ":{"); for (int j = 0; j < b[i].Count; j++) { Console.Write(b[i][j]); if (j + 1 < b[i].Count) Console.Write(","); } Console.WriteLine("}"); } }
运行结果
Random rd = new Random(j);
试了下,这样结果会更好看
@飞来飞去: 就是这个,谢谢。我是卡在这了
for (int i = 0; i < n; i++)
{
b.Add(new List<int>());
}
//手打的可能会错,自己改
//每次取5个元素,则得到:a1{1,2,3,4,5} //从这里开始的
//先把a1中的5个数随机排列
Random rand = new Random();
for(int i = 0; i<= 5; i++)
{
int r = rand.Next(5);
int temp = a1[i];
a1[i] = a1[r];
a1[r] = temp;
}
//再把a1中的5个数依次放入b,c,d,e,f中就是随机的
b.Add(a[0]);
c.Add(a[1]);
//.......
//剩下的估计你能解决了
如果N是个参数呢,我上面是我模拟的一个情况,如果N=3,那每个数组就是5了,我现在是不知道该怎么设计这N个数组,用什么数据结构。随机这块我能写出来,就是下面的不会了
@飞翔的球迷:
List<List<int>> list = new List<List<int>>();
for(int i = 0; i< N; i++)
{
list.Add(new List<int>());
}
是的,N数组就是二维数组..
随机数对N取余,就是数组编号了.