C#语言,有两个数组,数组1中元素有1,2,3.数组2中元素有A,B,C,D。求排列组合

排列为:123ABCD, ABCD123, 1ABCD23 , ABC1D23..... 注意:1,2,3和A,B,C,D的顺序不能变,即不能为:ABCD213, BACD123......

这个问题可以选择用插入法群举,按照你的要求 两个数组升序排列组合,可以这么写,帮你写到一个方法里面,如下,不明白的问我好了
private void pl()
{
char[] c1 = new char[] { 'a', 'b', 'c', 'd' };
char[] c2 = new char[] { '1', '2', '3' };
char[] cc = new char[(c1.Length + 1) * c2.Length+c1.Length];//预先准备一个数组
List<char[]> lc = new List<char[]>();
for (int i = 0; i < cc.Length; i++)//初始化数组,其中abcd先放好位置,
{
if ((i + 1) % c1.Length == 0) cc[i] = c1[((i + 1)/c1.Length)-1];
else cc[i] = '*';
}
for (int x = 0; x < cc.Length; x++)//群举插入123
{
char[] ncc = (char[])cc.Clone();
if (ncc[x] != '*') continue;
ncc[x] = c2[0];
for (int y = x + 1; y < cc.Length; y++)
{
char[] nncc = (char[])ncc.Clone();
if (nncc[y] != '*') continue;
nncc[y] = c2[1];
for (int z = y + 1; z < cc.Length; z++)
{
char[] nnncc = (char[])nncc.Clone();
if (nnncc[z] != '*') continue;
nnncc[z] = c2[2];
lc.Add(nnncc);//成功的数组加入
}
}
}
List<string> ls = new List<string>();
foreach (char[] ch in lc)
{//整理该列表所有符合要求的数组
string s="";
for (int i = 0; i < ch.Length; i++) s += ch[i];
s = s.Replace("*", "");
if (!ls.Contains(s)) ls.Add(s);//排除重复的加入链表
}
foreach (string s in ls) this.listBox1.Items.Add(s);//输出结果
}
可以用一个按钮事件来调用这个方法,上面方法用一个ListBox来显示排列的结果,你自己看下吧追问

非常感谢你的回答,我现在数组的个数不确定,数组中的元素个数也不确定,那自己定义的那个数组的长度如何确定?是有规律算出来的吗?

追答

这样的话 应该要重新设计算法 ,自己定义的那个数组是根据前面两个数组的长度计算出来的啊 ,(c1.Length + 1) * c2.Length+c1.Length就是了,但是你要是数组个数和元素个数都不确定的话 那必须要重新设计算法才能够适应,上面那个只是针对你给的例子设计出来的简单算法,不如你具体是什么要求说出来帮你想想看能不能设计。下面的三个for循环是针对你第二个数组的,如果都不确定的话 就不能这么算了哦

追问

现在就是数组的个数不确定,每个数组中的元素也不确定,要把这所有数组都排列在一起,并且每次排列时数组的顺序都不能变,你之前写的是对的,现在不确定的,有办法写吗

追答

当然有办法写,不过你这个分数是不是略坑。。

追问

现在发现,比如数组个数较多,每个数组中元素也较多,用群举的那个for循环就运算不来了,其他问题我已解决,就是这个效率问题还要继续优化,谢谢你的帮助,我就这点分了,不好意思。

追答

那是肯定的 但是如果个数控制在500以内 运算起来也不会用太长时间的的

温馨提示:内容为网友见解,仅供参考
无其他回答

C#语言,有两个数组,数组1中元素有1,2,3.数组2中元素有A,B,C,D。求...
char[] c1 = new char[] { 'a', 'b', 'c', 'd' };char[] c2 = new char[] { '1', '2', '3' };char[] cc = new char[(c1.Length + 1) * c2.Length+c1.Length];\/\/预先准备一个数组 List<char[]> lc = new List<char[]>();for (int i = 0; i < cc.Le...

c#中,如何对两个数组里的元素一一对应?
你真实的程序中是否就是用的123,如果是,那根本就不需用到两个数组,直接写 string[] b={"","x","y","z"};之后b[1]即"x",b[2]即y,b[3]即z 如果1.2.3以及x.y.z仅是你的举例,实际是没有任何规律的,那用字典是快一些,比如说 Dictionary<string, string> dic = new Dictionar...

c#有两个数组,想把这个两组中相同的元素放在另一个数组中
string[] str1={"1","2","4","9","6","23","12","28","10","5","15","30","19","22"};string[] str2={"1","4","2","6","30","26","33","19","27","42","44"};\/\/这是交集 var res = str1.Intersect(str2);\/\/这是差集 var res1 = str1.Excep...

c# 一个数组元素排列组合
从一个集合里取出N个元素组合,当N<=3时,用循环表述比较方便。string[] values = { "A", "B", "C", "D", "E" };Console.WriteLine("取2个组合:");for (int i = 0; i < values.Length - 1; i++){for (int j = i + 1; j < values.Length; j++)Console.WriteLine(va...

C# 输出一个字符数组元素的组合。。。
char[] x =new char[]{ 'a', 'b', 'c', 'd' };string shu=string.Empty;foreach(char i in x){ shu+=i.ToString();} for (int j = 0; j < x.Length; j++){ if (j > 0){ Console.WriteLine(shu.Insert(j, " "));} else { Console.WriteLine(shu);} } ...

请教C#两个数组找出相同的和各自不同的数值
static void Main(string[] args){ int[] A = { 1, 2, 3, 4, 5 }; int[] B = { 2, 4, 6 }; IEnumerable<int> en = A.Intersect(B);\/\/ A∩B 集合A与集合B的交集 foreach (var item in en) { Console.WriteLine(item); } IEnumerable<int>...

C# 数组元素排列组合
public static List<string> GetArrangeResult(string str){ str = str.Trim();if (string.IsNullOrEmpty(str)){ return new List<string>();} else if (str.Length == 1){ return new List<string> { str };} else if (str.Length == 2){ char[] ca = str.ToArray();return new ...

C#取已知数组元素的数组下标,有没有函数可以直接完成?
" + (index + 1).ToString() + " 个位置!"); \/\/然后弹出数组中第几个数值是2(因为数组是从0开始的,所以这里使index + 1); 只取数组下标的话,可以将 +1这个操作省去!就是\\x0d\\x0aMessageBox.Show("2所在数组下标值为: " + index.ToString()); \/\/获取数组下标 ...

怎样用c#语言将数组元素排序并输出?
public static void Sort(int[] array){ int[] arr=new int[]{45,12,44,4,5};for(int j=1;j<arr.Length;j++){\/\/外循环每次把参与排序的最大数排在最后 for(int i=0;i<arr.Length-j;i++){ \/\/内层循环负责对比相邻的两个数,并把最大的排在后面 if(arr[i]>arr[i+1]){ ...

C#编写一个方法,比较两个数组a和b(都有十个元素)看他们是否有完全相同...
\/\/调用string [] arr1 = new string [] {"1","2","3","4","5"};string [] arr2 = new string [] {"1","2","3","4","8"};bool result = CompareArrs(arr1, arr2);\/\/\/ <summary>\/\/\/ 比较两个数组是否完全一致\/\/\/ <\/summary>\/\/\/ <param name="arr1">数组1<\/...

相似回答