目前我正在尝试了解递归。在实现了像factorial之类的一些简单的递归算法后,我决定尝试更难的东西。
我发现了骑士的旅行问题,我试图制作一个能找到有效骑士之旅的节目。
当然它没有工作,输出是一个无限循环。
我无法看到错误。我自己学习,没有人问这个,所以我决定在这里问。
这是我的c ++代码:
#include<iostream>
using namespace std;
#define N 8
int tab[N][N];
void fill_with_zeros();
void display_array();
bool is_move_correct(int nx,int ny);
bool try_moving(int x,int y,int &nx,int &ny,int option);
bool knights_tour(int x,int y,int move_number);
int main()
{
fill_with_zeros();
knights_tour(0,0,1); //Passing coordinates and number of moves
return 0;
}
bool is_move_correct(int nx,int ny) //This functions checks if coordinates are valid
{
if(nx<N && ny<N && nx>=0 && ny>=0 && tab[nx][ny] == 0) return true;
return false;
}
bool try_moving(int x,int y,int &nx,int &ny,int option)
{
switch(option)
{
case 1 : { if(is_move_correct(x+2,y+1)==true) { nx = x +2,ny = y+ 1;return true;}}
case 2 : { if(is_move_correct(x+2,y-1)==true) { nx = x +2,ny = y- 1;return true;}}
case 3 : { if(is_move_correct(x-2,y+1)==true) { nx = x -2,ny = y + 1;return true;}}
case 4 : { if(is_move_correct(x-2,y-1)==true) { nx = x -2,ny = y - 1;return true;}}
case 5 : { if(is_move_correct(x+1,y+2)==true) { nx = x +1,ny = y +2;return true;}}
case 6 : { if(is_move_correct(x+1,y-2)==true) { nx = x +1,ny = y -2;return true;}}
case 7 : { if(is_move_correct(x-1,y+2)==true) { nx = x -1,ny = y +2;return true;}}
case 8 : { if(is_move_correct(x-1,y-2)==true) { nx = x -1,ny = y -2;return true;}}
}
return false;
}
bool knights_tour(int x,int y,int move_number)
{
tab[x][y] = move_number;
if(move_number == N*N-1)
{
cout<<"Here is the knight's path : "<<endl;
display_array();
return true;
}
// ******************************************************************************
//PROBLEM MUST BE IN THIS PART OF FUNCTION BUT I'M NOT ABLE TO TELL WHERE EXACTLY
else
{
//cout<<"Current move number : "<<move_number<<endl;
int nx = 0,ny = 0;
for(int w = 1; w<=8; w++)
{
if ( try_moving(x,y,nx,ny,w) == true )
{
if( knights_tour(nx,ny,move_number+1) == true )
{
return true;
}
}
}
tab[x][y] = 0;
}
return false;
}
// ******************************************************************************
// These functions don't need any commentary :
void fill_with_zeros()
{
for(int i =0; i<N; i++)
{
for(int j = 0; j<N; j++)
{
tab[i][j] = 0;
}
}
}
void display_array()
{
for(int i =0; i<N; i++)
{
for(int j = 0; j<N; j++)
{
cout<<tab[i][j]<<" ";
}
cout<<endl;
}
}
答案 0 :(得分:1)
我不认为这是无限的。但是,您正在运行具有O(8 ^ N)次迭代的指数递归函数。这需要很长时间才能完成 - 几小时甚至几年。您应该优化算法以查看是否可以在多项式时间内执行此算法。 (看起来像@HansKlünder指出了同样的事情。)
在网上搜索“骑士游览算法”会出现一些您可以尝试实施的优秀算法。 This question仅在几天前发布了Java实现,作者已提出帮助。