SRM397 DIV2 Level.1
適当に解いたらタイムアウト。
一度試したパターンは飛ばすように書き換えたら普通に通った。
public class Pair<T, U> { public Pair() { } public Pair(T first, U second) { this.First = first; this.Second = second; } public T First; public U Second; } public class SortingGame { bool isSorted(int[] array) { bool isSorted = true; for (int i = 1; i < array.Length; i++) { if (array[i - 1] >= array[i]) { isSorted = false; break; } } return isSorted; } int getSig(int[] array) { int ret = 0; for (int i = 0; i < array.Length; i++) { ret += array[i]; ret *= 10; } return ret; } public int fewestMoves(int[] board, int k) { int size = board.Length; Pair<int[], int> p = new Pair<int[], int>(); p.First = (int[])board.Clone(); p.Second = 0; Queue<Pair<int[], int>> q = new Queue<Pair<int[], int>>(); q.Enqueue(p); Dictionary<int, int> dic = new Dictionary<int, int>(); while (q.Count != 0) { Pair<int[], int> hoge = q.Dequeue(); int sig = getSig(hoge.First); if (dic.ContainsKey(sig)) { continue; } else { dic[sig] = 1; } if (isSorted(hoge.First)) { return hoge.Second; } for (int i = 0; i <= size - k; i++) { Pair<int[], int> p2 = new Pair<int[], int>(); p2.First = (int[])hoge.First.Clone(); p2.Second = hoge.Second + 1; Array.Reverse(p2.First, i, k); q.Enqueue(p2); } } return -1; } }