Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }