骑士之旅为8x8无限递归
这里将是我的代码为8x8甲板的着名骑士之旅。所以,我的代码的主要思想是:我们将选择打开我们的目的地,用isPossible检查它,然后对其进行检查,将此单元格标记为1。所以,检查每个细胞,如果我们将在64个细胞中 - 返回true。 但我的代码去无限recurssion,我无法调试它,任何建议将不胜感激。骑士之旅为8x8无限递归
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;
}
}
我认为你的问题是你的测试计数< 64,但你从来没有分配数。你只是通过(通过值!)'计数+1'给put方法。您可能认为这将写回计数变量。但事实并非如此......请注意,调试是您需要学习的第一项技能!
谢谢你的建议,但是当我改变了'count + 1'到'++计数'这个程序实际上适用于8x8。但它也适用于4x4,这是不可能的。 – ratkke 2014-10-19 22:25:49
@ratkke你的时间复杂度是多少?尝试每个8×8(这是64!)的排列对于任何普通计算机来说都是不可能的,所以如果这适用于4x4(16!)但不是8x8 – 2014-10-20 05:58:32
是正常的您的问题是为什么您的代码无限期地运行。我指出了你。为什么它也适用于4x4 ....?我想你应该看看你的设计... – 2014-10-20 12:14:55
“我无法调试它”为什么不呢?我建议你学习如何调试它。 – spender 2014-10-19 21:49:43
但是这里是所有变体的半身像,我该如何调试它? – ratkke 2014-10-19 21:58:21
您可以使用断点轻松地使用Visual Studio调试器进行调试,甚至只需将某些跟踪输出放在正确的位置,并确保所有值都在预期的范围内。 – spender 2014-10-19 22:01:44