bool AnalyzeForProofInternalOriginalFixerBreaker(SuperSlimBoard board, HashSet <SuperSlimBoard> wonBoards) { var winInfo = new GameTreeInfo(); WinTreeInfo[board] = winInfo; var lossInfo = new GameTreeInfo(); LossTreeInfo[board] = lossInfo; var colorPairs = new List <Tuple <int, int> >(); for (int i = 0; i < board._length; i++) { for (int j = i + 1; j < board._length; j++) { colorPairs.Add(new Tuple <int, int>(i, j)); } } foreach (var cp in colorPairs.OrderBy(cp => (board._trace[cp.Item1] ^ board._trace[cp.Item2]).PopulationCount())) { var i = cp.Item1; var j = cp.Item2; var x = board._trace[i]; var y = board._trace[j]; var swappable = x ^ y; foreach (var v in swappable.GetBits()) { var good = true; var responses = new [] { v }.Concat((swappable ^ v).GetBits().Select(w => w | v)); foreach (var response in responses) { var childBoard = new SuperSlimBoard(board._trace, i, j, response, board._stackCount); if (wonBoards.Contains(childBoard)) { winInfo.Add(new List <ulong>() { response }, i, j, response); } else { lossInfo.Add(new List <ulong>() { response }, i, j, response); good = false; break; } } if (good) { return(true); } winInfo.Clear(); } } return(false); }
bool AnalyzeForProofInternal(SuperSlimBoard board, HashSet <SuperSlimBoard> wonBoards) { var winInfo = new GameTreeInfo(); WinTreeInfo[board] = winInfo; var lossInfo = new GameTreeInfo(); LossTreeInfo[board] = lossInfo; var colorPairs = new List <Tuple <int, int> >(); for (int i = 0; i < board._length; i++) { for (int j = i + 1; j < board._length; j++) { colorPairs.Add(new Tuple <int, int>(i, j)); } } foreach (var cp in colorPairs.OrderBy(cp => (board._trace[cp.Item1] ^ board._trace[cp.Item2]).PopulationCount())) { var i = cp.Item1; var j = cp.Item2; var x = board._trace[i]; var y = board._trace[j]; var swappable = x ^ y; var winningSwapAlwaysExists = true; foreach (var breakerChoice in GetBreakerChoices(swappable)) { var winningSwapExists = false; GetFixerResponses(breakerChoice); var responses = Enumerable.Range(1, _fixerResponseCount - 1).Select(k => _fixerResponses[k]).OrderBy(fr => fr.PopulationCount()); foreach (var response in responses) { if (_swapMode == FixerBreakerSwapMode.SingleSwap && response.PopulationCount() > 2) { break; } var childBoard = new SuperSlimBoard(board._trace, i, j, response, board._stackCount); if (wonBoards.Contains(childBoard)) { winningSwapExists = true; winInfo.Add(breakerChoice, i, j, response); break; } else { lossInfo.Add(breakerChoice, i, j, response); } } if (!winningSwapExists) { winInfo.Clear(); winningSwapAlwaysExists = false; break; } } if (winningSwapAlwaysExists) { return(true); } } return(false); }