广度优先搜索解决难题

时间:2013-10-07 21:05:58

标签: c# xna breadth-first-search

我做了一个flip-game,我正试图让一个方法给玩家一个关于他们下一步行动的暗示。基本上,我正在尝试使用广度优先搜索来解决游戏,然后向玩家展示下一步行动。但是,我的算法遇到了一些问题。 Exit()只是为了帮我调试。无论如何,算法成功地将当前游戏状态isWhite添加到gameStates并检查它是否是解决方案。当我尝试添加到队列时出现问题。我的代码永远不会到达第二个Exit(),我无法弄清楚原因。任何帮助,将不胜感激。感谢。

编辑:问题已解决。现在我只需要找出解决方案后该如何解决...

 private void hint()
    {
        Queue<bool[,]> statesToCheck = new Queue<bool[,]>();
        List<bool[,]> closedStates = new List<bool[,]>();
        bool[,] rootState = new bool[4, 4];
        rootState = (bool[,])isWhite.Clone();

        statesToCheck.Enqueue((bool[,])rootState.Clone());
        //closedStates.Add((bool[,])rootState.Clone());

        while (statesToCheck.Count() > 0)
        {
            bool solved = true;
            //checks for solution state
            rootState = statesToCheck.Dequeue();
            for (int row = 0; row < GAME_SIZE; row++)
                for (int col = 0; col < GAME_SIZE; col++)
                {
                    if (!rootState[row, col])
                        solved = false;
                }
            if (solved)
            {
                //add something to do
                System.Diagnostics.Debug.Write("It worked");
                return;
            }
            else
            {
                closedStates.Add((bool[,])rootState.Clone());
            }
            //simulates clicking each space and adds each one to statesToCheck
            for (int row = 0; row < GAME_SIZE; row++)
                for (int col = 0; col < GAME_SIZE; col++)
                {
                    bool[,] stateToChange = new bool[4, 4];
                    stateToChange = (bool[,])rootState.Clone();

                    flip(stateToChange, row, col);//gets next gameState (next node in a typical breadth-first search)

                    if (!closedStates.Contains(stateToChange))
                    {
                        //closedStates.Add((bool[,])rootState.Clone());
                        statesToCheck.Enqueue((bool[,])stateToChange.Clone());
                    }
                }
        }

1 个答案:

答案 0 :(得分:1)

如果您需要调试代码,为什么不使用断点,而不是调用Exit并关闭程序?
通过这种方式,您可以按指令分析指令并了解代码中发生的情况。

修改

您声明的stateToCheck与您在checkedStates中添加的List相同,并且您在“模拟点击每个空格并将每个空间添加到游戏状态”中编辑的相同,所以我认为您更改了该二维数组,您也更改了checkedStates.Contains(stateToCheck)中的那个,因为它们具有相同的引用。

这就是{{1}}始终为真的原因。