魔方陣の規則を満足する組合せ全てを動的に計算する方法を探っています。
そのために次の処理を考えました。
しかし、最終的にToList<Int32[]>をするために、
Edge = 3 から 5に増やすと、パフォーマンスが格段に落ちています。
一番の原因は組合せ数の増加だと考えていますが、これを3, 5, 7と増やしてもある程度の
パフォーマンスを期待できる方法があればご教示ください。
どうぞよろしくお願いします。
処理の概要を、以下に記述します。
List<Int32[]> indexers // (行・列等の合計算出に使用するindexの集合)
int Edge // (辺の段数)
int Average // (各行・列の基準の合計)
lang
1IEnumerable<IEnumerable<Int32>> ap = allpermutation(Edge * Edge, nums) 2 .Where(line => indexers.All<Int32[]>( 3 indexes => (from index in indexes select line.ElementAt<Int32>(index)).Sum() == Average)); 4 5// 全順列を求めるメソッド 6static IEnumerable<IEnumerable<T>> allpermutation<T>(int count, IEnumerable<T> nums) 7{ 8 if (count == 1) 9 yield return new T[1] { nums.First<T>() }; 10 else 11 { 12 foreach (T t in nums) 13 { 14 T[] Current = new T[1] { t }; 15 IEnumerable<IEnumerable<T>> Rear = allpermutation(count - 1, nums.Except(Current)); 16 foreach (IEnumerable<T> childR in Rear) 17 yield return Current.Concat<T>(childR); 18 } 19 } 20}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。