【发布时间】:2019-02-04 14:42:14
【问题描述】:
我尝试使用回溯为骑士之旅问题编写代码。我的代码适用于 4x4 矩阵,但对于 8x8 矩阵,它不会在输出屏幕上显示任何内容。
我不知道我做错了什么。
这就是我的代码的工作方式:
如果所有方块都被访问过
print the solution
其他
将下一步移动之一添加到解向量并递归 检查此举动是否会导致解决方案。 (一个骑士可以最大 八个动作。我们在这一步的 8 个动作中选择一个)。
如果在上述步骤中选择的移动没有导致解决方案 然后从解决方案向量中删除此移动并尝试其他 替代动作。
如果没有一个替代方案有效,则返回 false(返回 false 将在递归中删除先前添加的项目,如果为 false 由递归的初始调用返回然后“不存在解决方案”)
这是我写的代码:
#include<iostream>
using namespace std;
#define n 8
int safe(int c[n][n],int i, int j)
{
if((i>=0&&i<n)&&(j>=0&&j<n))
{
if(c[i][j])
return 0;
else
return 1;
}
return 0;
}
int knightstour(int c[n][n],int i,int j,int k)
{
if(k==n*n)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
return 1;
}
else
{
c[i][j]=k;
if(safe(c,i+2,j+1))
{
if(knightstour(c,i+2,j+1,k+1))
return 1;
}
if(safe(c,i+2,j-1))
{
if(knightstour(c,i+2,j-1,k+1))
return 1;
}
if(safe(c,i-2,j+1))
{
if(knightstour(c,i-2,j+1,k+1))
return 1;
}
if(safe(c,i-2,j-1))
{
if(knightstour(c,i-2,j-1,k+1))
return 1;
}
if(safe(c,i+1,j+2))
{
if(knightstour(c,i+1,j+2,k+1))
return 1;
}
if(safe(c,i-1,j+2))
{
if(knightstour(c,i-1,j+2,k+1))
return 1;
}
if(safe(c,i+1,j-2))
{
if(knightstour(c,i+1,j-2,k+1))
return 1;
}
if(safe(c,i-1,j-2))
{
if(knightstour(c,i-1,j-2,k+1))
return 1;
}
c[i][j]=0;
return 0;
}
}
int main()
{
int c[n][n]={0};
if(!knightstour(c,0,0,0))
cout<<"solution doesn't exist";
return 1;
}
【问题讨论】:
-
“它没有在输出屏幕上显示任何东西。” 所以计算还没有完成。测试的可能性很大,所以除非你有无限循环,否则检查每一个可能性都需要时间。
-
啊,但是我的代码是否正确,我的意思是它能产生正确的输出吗?
-
@FeiXiang n 是宏,decl 是可能的
-
@138 哎呀,在顶部错过了。
-
从
main()返回除 0 以外的任何值通常表示程序没有成功运行。
标签: c++ backtracking