【问题标题】:Loop running infinitely C++ for Knight Tour Problem循环无限运行 C++ 以解决骑士巡回赛问题
【发布时间】:2020-10-28 14:38:01
【问题描述】:

我正在用 C++ 编写 Knight Tour 问题。但它无限期地运行。我检查了我的逻辑,和here提到的逻辑类似

#include<bits/stdc++.h>
using namespace std;

bool isvalid(vector<vector<int>>board,int i,int j)
{
    return i >= 0 && j >= 0 && i < 8 && j < 8 ;
};

bool checkcompletion(vector<vector<int>>board)
{
    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
            if(board[i][j]==0)
                return false;
    }
    return true;
}
int tour(vector<vector<int>>board,int i,int j,int steps)
{
    //CHECK IF IT IS A VALID STEP IF NOT VALID THEN RETURN 0
    if(!isvalid(board,i,j))
    {
        return 0;
    }

    //CHECK IF THAT PLACE IS ALREADY VISITED(MOVED OUT OF ISVALID AS THAT FUNCTION ME 
    //GET A OUT OF BOUND REQUEST WHICH WILL CAUSE SEGMENTATION FAULT)
    // cout<<i<<" "<<j<<endl;
    if(board[i][j]!=0) return 0;

    //CHECK IF ALL ARE MARKED FOR TERMINATION
    if(steps==64)return 1;
    //if(checkcompletion(board)) return 1;


    //BACKTRACKING IDEA VARIABLE
    board[i][j]=++steps;

    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
        {
            if(board[i][j]>9)
                cout<<" "<<board[i][j]<<" ";
            else
                cout<<" "<<board[i][j]<<"  ";
        } 
        cout<<"\n";
    }
    cout<<"================================\n";
    tour(board,i+2,j+1,steps);
    tour(board,i+1,j+2,steps);
     tour(board,i-1,j+2,steps);
     tour(board,i-2,j+1,steps);
    tour(board,i-2,j-1,steps);
    tour(board,i-1,j-2,steps);
   tour(board,i+1,j-2,steps);
    tour(board,i+2,j-1,steps);
    
    

    board[i][j]=0;
}

int main()
{
    //for marking the visited part as well as noting the number os steps
    vector<vector<int>>board (8,vector<int>(8,0));
    int steps = 0;

    //MADE steps =1 for 0,0
    //board[0][0]=++steps;
    //initil position 0,0
    tour(board,0,0,steps);

}

谁能告诉我这段代码有什么问题?当我检查数组的中间状态时,它工作正常。是不是因为算法很复杂,因此它运行了更长的时间,我把它误认为是一个无限循环? 我检查了这个answer,它描述了这个问题有多复杂。

【问题讨论】:

  • 现在是学习竞赛/在线评委网站不会教给您的东西的好时机:调试!使用调试器 您可以在监视变量及其值并查看它们如何变化的同时逐语句逐句执行代码。这是解决此类问题的正常方法。
  • 另外一些帮助您创建工作程序的技巧:Find a simpler problem。我的意思是你不会一次编写大量代码(绝对不是整个程序),只是在难以测试和调试时进行测试。相反,只需编写尽可能小的代码(从空的main 函数开始)、构建(启用额外警告)并测试。只有当那段代码你继续下一个小而简单的部分。这样做直到程序完成。
  • 如果您通过参考通过您的板,它肯定会运行得更快。
  • @Someprogrammerdude 感谢您的建议。我尝试调试代码,并且代码在最后几次迭代中运行良好,直到我强行停止它。但是即使逻辑正确,代码似乎也没有终止。

标签: c++ algorithm recursion backtracking knights-tour


【解决方案1】:

你想要做的是递归函数,但你没有退出条件,所以函数在循环中调用自己。您应该根据函数的目标在函数中的某个位置放置一个 return。例如:

if (tour(board, i + 2, j + 1, steps) == 0)
{
    return steps;
}

(这是一个例子,我不知道你是什么情况)

如果您想了解更多关于递归函数的信息,请访问以下网站:

https://beginnersbook.com/2017/08/cpp-recursion/#:~:text=The%20process%20in%20which%20a,f(n)%20%3D%201.

https://www.geeksforgeeks.org/recursion/

此外,我建议您使用调试器来了解代码卡住的原因和位置。

希望对您有所帮助:)

【讨论】:

  • 嘿,@רן מורסקי 谢谢!我的代码实际上终止了,但我没有得到它。每当我们调用递归函数时,为什么我们要返回步骤?无论如何,当条件满足时,我们将返回这些步骤。还不够吗?
  • 当然!如果您仅在第一个条件下返回,则程序不会停止,除非第一个条件是最后一步,因此您需要在每个条件下都返回一个(希望很清楚,如果不是,您可以尝试再添加一条评论到这个或在 youtube 上搜索递归函数和国际象棋的例子或类似的东西)祝你好运!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多