优快云上问全组合的问题挺多的,自己之前也在那里问过类似的问题,一直没有找到让自己特别满意的高效算法。 这两天又思考了一阵,总算找到了一种不错的方法,代码如下: static string[] m_Data = { "A", "B", "C", "D", "E"}; static void Main(string[] args) { GetZhuHe(m_Data); Console.ReadLine(); GetPaiLie(m_Data); Console.ReadLine(); } static void GetZhuHe(string[] data) { Dictionary<string, int> dic = new Dictionary<string, int>(); for (int i = 0; i < data.Length; i++) { Console.WriteLine(data[i]); dic.Add(data[i], i); } GetString(dic,data); } static void GetString(Dictionary<string, int> dd, string[] data) { Dictionary<string, int> dic = new Dictionary<string, int>(); foreach (KeyValuePair<string, int> kv in dd) { for (int i = kv.Value + 1; i < data.Length; i++) { Console.WriteLine(kv.Key + data[i]); dic.Add(kv.Key + data[i], i); } } if (dic.Count > 0) GetString(dic,data); } //又考虑了一下全排列的算法,代码如下: static void GetPaiLie(string[] data) { Dictionary<List<int>, int> dic = new Dictionary<List<int>, int>(); for (int i = 0; i < data.Length; i++) { Console.WriteLine(data[i]); List<int> list = new List<int>(); list.Add(i); dic.Add(list, i); } GetPaiLieString(dic, data); } static void GetPaiLieString(Dictionary<List<int>, int> dd, string[] data) { Dictionary<List<int>, int> dic = new Dictionary<List<int>, int>(); foreach (KeyValuePair<List<int>, int> kv in dd) { for (int i = kv.Value + 1; i < data.Length; i++) { List<int> list = kv.Key; for (int j = 0; j <= list.Count; j++) { List<int> temp = new List<int>(list.ToArray()); temp.Insert(j, i); OutPut(temp, data); dic.Add(temp, i); } } } if (dic.Count > 0) GetPaiLieString(dic, data); } static void OutPut(List<int> list, string[] data) { string temp = string.Empty; foreach (int n in list) { temp += data[n]; } Console.WriteLine(temp); }