骑士之旅问题:
骑士被放置在一个空棋盘的第一块上,并且根据国际象棋的规则移动,必须对每个广场精确地访问一次。打印路径,使其覆盖所有块。

无法理解为什么代码陷入无限循环。浪费的时间仍然毫无头绪。
我有解决方案,但不明白为什么这个特定的代码无法正常工作。

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

//possible moves
int rowMove[] = {2,1,-1,-2,-2,-1,1,2};
int colMove[] = {1,2,2,1,-1,-2,-2,-1};


void printBoard(vector<vector<int>> visited)
{
    for(int i=0; i<N; i++)
    {
        for(int j=0;j<N;j++)
            cout<<visited[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}

//check if the given move is valid
bool isValid(vector<vector<int>> visited,int row, int col)
{
    return (row>=0 && row<N && col>=0 && col<N && visited[row][col]==0);
}


bool solveKnight(vector<vector<int>> visited,int row, int col,int move)
{
    //printBoard(visited);
    if(move==N*N)
    {
        printBoard(visited);
        return true;
    }

    else
    {
        for(int i=0;i<8;i++)
        {
            int newRow = row + rowMove[i];
            int newCol = col + colMove[i];

            if(isValid(visited,newRow,newCol))
            {
                move++;
                visited[newRow][newCol] = move;
                if(solveKnight(visited,newRow,newCol,move))
                    return true;
                move--;
                visited[newRow][newCol]=0;
            }
        }
    }
    return false;
}


int main()
{
    vector<vector<int>> visited(N,vector<int>(N,0));
    visited[0][0]=1;
    if(!solveKnight(visited,0,0,1))
        cout<<"not possible";
    return 0;
}

最佳答案

这里有两件事是错误的:


您正在复制每个64-int向量。单。时间。
您将打印9行以输出到每一行。单。时间。


这两个都是极其昂贵的操作。您最多可以递归8 ^ 64 = 2 ^ 192次。这不是一个小数目。

如果您通过引用传递矢量并在每次递归调用开始时杀死printBoard ...中提琴! https://ideone.com/K0DU3q

关于c++ - 陷入无限循环(骑士之旅问题),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58087835/

10-12 20:31