骑士之旅问题:
骑士被放置在一个空棋盘的第一块上,并且根据国际象棋的规则移动,必须对每个广场精确地访问一次。打印路径,使其覆盖所有块。
无法理解为什么代码陷入无限循环。浪费的时间仍然毫无头绪。
我有解决方案,但不明白为什么这个特定的代码无法正常工作。
#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/