Knight's Tour C ++使用堆栈

时间:2018-04-02 00:54:31

标签: c++ algorithm backtracking knights-tour

我目前正在使用Stack存储我的动作,在c ++中使用Knight tour Chessboard游戏。我遇到了一个不会结束程序的奇怪循环。任何人都可以帮我代码吗?

npm install --global --production windows-build-tools

我刚刚创建的一些部分用于调试并查看每个函数的工作方式,因此忽略这些部分。 循环总是继续,似乎永远不会结束。我试图跟踪堆栈中的数据,但这对我来说似乎是合理的。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

查看代码的这一部分时:

for ( int j = 0; j < 9; j++ ) {
    if ( check_if_valid(position.row+Lshape.Lrow[j],position.col+Lshape.Lcol[j]) /*&& check_empty(board,position)*/) {
        // code...
        if ( checkEmpty( board, hello ) {
            // code...
            j = -1;
            if ( isReady(position, board) == true ) { // == true not needed
                // code...
            }
        }
    }
    if ( j == 8 ) {
        // code...
        j = counter.top()
        // code...
        if ( isReady(position, board) == true ) { // == true not needed
            // code...
        }
    }
} // for loop

当条件返回true时,考虑for循环中1 st 嵌套if语句中发生的情况。您正在将j更改为-1

再次在for循环中的2 nd if语句中j==8再次将j更改为counter.top()

此行为将导致for循环的无限递归。这是一个简单的例子:

#include <iostream>
#include <iomanip>

int main() {

    int counter = 0;
    for ( int i = 0; i < 5; i++ ) {
        if ( i == 4 ) {
            i = 0;
        }
        ++counter;
        std::cout << "Count the recursion: " 
                  << std::setw( 2 ) << counter << " " << i << '\n';

        // just to stop the recursion
        if ( counter == 10 ) break;
    }

    std::cout << "\nPress any key and enter to quit.\n";
    std::cin.get();
    return 0;
}

没有最后if语句的上述程序将模拟程序中发生的情况。我只包括那个,以便停止循环只是为了显示输出的进展。

我不知道你是否故意想要for循环的无限递归;但是如果你这样做,你需要在调试器中检查你的计数器变量,以确保它们匹配执行退出循环所涉及的语句所需的值以停止递归。正如我在上面的小例子中所示;没有计数器的条件等于10。循环将永远持续下去。

作为旁注,如果你打算有一个无限循环;通过这种方式构建它们通常更好,这样就可以更清楚地了解你的目的。

int counter = 0;
for ( ; ; ) {
    ++counter;

    // do some work;

   if ( counter == exit condition )  break;
}

int counter = 0;
for ( ; ; ) {
    // do some work;

    if work above is valid
       increment counter
    else
       break;
}

或者您可以使用while循环

counter = some value
while ( true ) {
   check counter for condition;

   do some work

   increment or set counter;
}