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

排列为:123ABCD,ABCD123,1ABCD23,ABC1D23.....注意:1,2,3和A,B,C,D的顺序不能变,即不能为:ABCD213,BACD123..... 排列为:123ABCD, ABCD123, 1ABCD23 , ABC1D23..... 注意:1,2,3和A,B,C,D的顺序不能变,即不能为:ABCD213, BACD123...... 展开
 我来答
百度网友7695b6b
2013-09-07 · TA获得超过165个赞
知道小有建树答主
回答量:126
采纳率:0%
帮助的人:120万
展开全部
这个问题可以选择用插入法群举,按照你的要求 两个数组升序排列组合,可以这么写,帮你写到一个方法里面,如下,不明白的问我好了
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循环是针对你第二个数组的,如果都不确定的话  就不能这么算了哦
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式