【发布时间】:2020-09-03 18:46:31
【问题描述】:
当我尝试使用回溯运行 Knights Tour 问题的解决方案时,我遇到了一个无限循环
我的解决方案代码: 链接:https://ideone.com/Ud92vF 代码:
#include <bits/stdc++.h>
using namespace std;
bool valid(int arr[8][8],int r,int c)
{
if(r>=0 and r<8 and c>=0 and c<8 and arr[r][c]== -1)
return true;
return false;
}
void fun(int arr[8][8],int r,int c,int x)
{
if(x==64){
cout<<"***********************ARRAY FOUND***********************\n";
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
cout<<arr[i][j]<<" ";
cout<<"\n";
}
return;
}
if(!valid(arr,r,c))
return;
arr[r][c] = x;
fun(arr,r-2,c+1,x+1); fun(arr,r-2,c-1,x+1);
fun(arr,r-2,c+2,x+1); fun(arr,r-2,c-2,x+1);
fun(arr,r+2,c+1,x+1); fun(arr,r+2,c-1,x+1);
fun(arr,r+1,c+2,x+1); fun(arr,r+1,c-2,x+1);
arr[r][c] = -1;
}
int main()
{
int arr[8][8] ;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
arr[i][j] = -1;
}
int r=0,c=0,x=0; fun(arr,r,c,x);
}
【问题讨论】:
-
我会先让你的代码通过合理的缩进变得可读。还可以使用调试器逐行单步执行您的代码。您会惊讶于这对观察变量变化有多大帮助。
-
fun(arr,r-2,c+2,x+1); fun(arr,r-2,c-2,x+1);看起来不对。 -
这就是为什么我使用 bool valid() 进行绑定检查
标签: c++ recursion backtracking knights-tour