【问题标题】:The knights tour for 8x8 infinite recurssion8x8无限递归的骑士之旅
【发布时间】:2014-10-19 21:45:40
【问题描述】:

这将是我著名的 8x8 甲板骑士巡回赛的代码。所以,我的代码的主要思想是:我们将从 Turns 中选择我们的目的地,用 isPossible 检查它,然后递归到它,将此单元格标记为“1”。所以,检查每个单元格,如果我们将在 64 的单元格中 - 返回 true。 但是我的代码会无限递归,我无法调试它,任何建议都将不胜感激。

class Class1
{
    static void Main(string[] args)
    {
        int x = 0;
        int y = 0;
        Console.WriteLine("Enter X and press enter");
        x = Int32.Parse(Console.ReadLine());
        Console.WriteLine("Enter Y and press enter");
        y = Int32.Parse(Console.ReadLine());
        TurnVariation Turns = new TurnVariation(); 
        EmptyBoard Board = new EmptyBoard();
        if (TryPut.Put(Board, x, y, Turns, 1, false))
        {
            Console.WriteLine("МОЖНА!!!!");
        }
        else
        {
            Console.WriteLine("NET!!");
        }
    }
}

public class TryPut : EmptyBoard
{
    public static bool Put(EmptyBoard Board, int x, int y, TurnVariation Turns, int count, bool flag)
    {
        int tempX = 0;
        int tempY = 0;
        if (count >= 64)
        {
            Console.WriteLine("yeab");
            return true;
        }
        for (int i = 0; i <= 7; i++)
        {
            tempX = x + Turns.Turns[i,0];
            tempY = y + Turns.Turns[i,1];
            //Console.WriteLine(count); 
            if (IsPossible(Board, tempX, tempY))
            {
                Board.Array[tempX, tempY] = 1;

                flag = Put(Board, tempX, tempY, Turns, count+1, flag);
                if (flag)
                {
                    break;
                }
                Board.Array[tempX, tempY] = 0;
            }
        }
        if (flag)
            return true;
        else
            return false;
    }

    public static bool IsPossible(EmptyBoard Board, int x, int y)
    {
        if ((x < 0) || (x > 7) || (y < 0) || (y > 7))
            return false;
        if (Board.Array[x, y] == 1)
            return false;
        return true;
    }
}

public class TurnVariation
{
    public int[,] Turns = new int[8, 2];
    public TurnVariation()
    {
        Turns[0, 0] = -2; Turns[0, 1] = 1;
        Turns[1,0] = -2; Turns[1,1] = -1;
        Turns[2,0] = -1; Turns[2,1] = 2;
        Turns[3,0] = 1; Turns[3,1] = 2;
        Turns[4,0] = 2; Turns[4,1] = 1;
        Turns[5,0] = 2; Turns[5,1] = -1;
        Turns[6,0] = 1; Turns[6,1] = -2;
        Turns[7,0] = -1; Turns[7,1] = -2;
    }
}

public class EmptyBoard
{
    public const int N = 8;
    public int[,] Array = new int[N, N];
    public EmptyBoard()
    {
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                Array[i, j] = 0;
    }
}

【问题讨论】:

  • “我无法调试它” 为什么不呢?我建议你学习如何调试它。
  • 但是这里是所有变体的半身像,我该如何调试它?
  • 您可以使用 Visual Studio 调试器使用断点轻松进行调试。甚至只需将一些跟踪输出放在正确的位置并确保所有值都在预期范围内。
  • 你的时间复杂度是多少?尝试 8x8(即 64!)的所有排列对于任何普通计算机都是不可能的,所以如果这适用于 4x4(16!)但不适用于 8x8,这是正常的

标签: c# algorithm recursion knights-tour


【解决方案1】:

我认为您的问题是您对计数的测试

请注意,调试是您需要学习的第一项技能!

【讨论】:

  • 感谢您的推荐,但是在我将“count + 1”更改为“++count”后,该程序实际上适用于 8x8。但它也适用于 4x4,这是不可能的。
  • @ratkke 你的时间复杂度是多少?尝试 8x8(即 64!)的所有排列对于任何普通计算机都是不可能的,所以如果这适用于 4x4(16!)但不适用于 8x8,这是正常的
  • 您的问题是为什么您的代码会无限期运行。我向你指出了这一点。为什么它也适用于 4x4....?我认为你应该看看你的设计......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多