陷入无限循环(骑士之旅问题)

时间:2019-09-24 20:41:16

标签: c++ recursion backtracking knights-tour

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

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

#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;
}

1 个答案:

答案 0 :(得分:1)

这里有两件事是错误的:

  1. 您正在复制每个64位整数向量。单。时间。
  2. 您正在向标准输出打印9行。单。时间。

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

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