实现方式:
采用插值的方法。
如:{1,2,3,4} 把2 插入到1中 得到结果为 1,2 2,1 之后采取递归的方式再把3 插入到 1,2 2,1 两个数组中。。。
结果为:
4 3 2 1,3 4 2 1,3 2 4 1,3 2 1 4 ,4 2 3 1,
2 4 3 1,2 3 4 1,2 3 1 4 4 2 1 3,2 4 1 3,
2 1 4 3,2 1 3 4 4 3 1 2,3 4 1 2,3 1 4 2,
3 1 2 4 4 1 3 2,1 4 3 2,1 3 4 2,1 3 2 4,
4 1 2 3,1 4 2 3,1 2 4 3,1 2 3 4
代码如下:
/// <summary> /// 插入对象v到对象数组o中 /// </summary> /// <param name="o">目标对象数组</param> /// <param name="v">插入值</param> /// <param name="lb">展现控件</param> /// <param name="size">源数组的长度,判断何时对展现控件赋值</param> /// <returns>查数之后的结果集</returns> public string[] insertVal(object[] o, object v, ListBox lb, int size) { int len = o.Length; object[] tep = new object[len + 1]; string[] result = new string[len + 1];
for (int i = 0; i < len + 1; i++) { for (int j = 0; j < len; j++) { tep[j] = o[j]; } moveVal(ref tep, i, len); tep[i] = v;
string s = ""; for (int k = 0; k < len + 1; k++) { s = s + tep[k] + " "; } s = s.Substring(0, s.Length - 1); if (tep.Length == size) lb.Items.Add(s);
result[i] = s; } return result;
}
/// <summary> /// 移动数组,起始位置数据依次顺移到截止位置 /// </summary> /// <param name="o">源数组</param> /// <param name="start">起始位置</param> /// <param name="end">截止位置</param> void moveVal(ref object[] o, int start, int end) { for (int i = end; i >= start; i--) { if (i > 0) o[i] = o[i - 1]; } }
string[] tt = null;
/// <summary> /// 递归方法体,递归插值 /// </summary> /// <param name="o">源数组</param> /// <param name="s">待插值数组</param> /// <param name="start">起始插入位置</param> /// <param name="lb">展现控件</param> public void GetAllPL(object[] o, string[] s, int start, ListBox lb) { object[] t = null; if (start >= o.Length) return; for (int k = 0; k < s.Length; k++) { t = s[k].Split(' '); if (start > t.Length) start = t.Length; tt = insertVal(t, o[start], lb, o.Length); start = start + 1; GetAllPL(o, tt, start, lb); } }
private void button6_Click(object sender, System.EventArgs e) { listBox1.Items.Clear(); object[] o = new object[] { 1, 2, 3, 4, 5, 6 };
int start = 1; new plzh().GetAllPL(o, new string[] { o[0].ToString() }, start, listBox1); }