C 8带回溯的谜题

C 8带回溯的谜题,c,recursion,backtracking,C,Recursion,Backtracking,我正在读斯基纳的这本书,编程挑战,在回溯章节之后,有一个关于用回溯法解决15个难题的问题,我把它简化为8个难题,只是在试验。我有这个递归代码,我想知道它是否有机会找到解决方案。代码有点难看(请注意): #包括 #包括 #包括 国际广播电台[20][20]={ {3,1,2}, {4,0,5}, {6,8,7} }; int moveX[20]={1,1,1,0,0,-1,-1,-1}; int-moveY[20]={0,1,-1,1,-1,0,1,-1}; int深度=0; int findRo

我正在读斯基纳的这本书,编程挑战,在回溯章节之后,有一个关于用回溯法解决15个难题的问题,我把它简化为8个难题,只是在试验。我有这个递归代码,我想知道它是否有机会找到解决方案。代码有点难看(请注意):

#包括
#包括
#包括
国际广播电台[20][20]={
{3,1,2},
{4,0,5},
{6,8,7}
};
int moveX[20]={1,1,1,0,0,-1,-1,-1};
int-moveY[20]={0,1,-1,1,-1,0,1,-1};
int深度=0;
int findRow(){
int i,j;

对于(i=0;i您有五个问题。首先,
isReady
函数不正确。它应该如下所示:

int isReady(){
    if(arr[0][0]==1 && arr[0][1]==2 && arr[0][2]==3 &&
            arr[1][0]==4 && arr[1][1]==5 && arr[1][2]==6 &&
            arr[2][0]==7 && arr[2][1]==8){
        return 1;
    }
    else return 0;
}
第二,您正在使用
diffX
diffY
超出您的谜题边界。您需要更改此选项:

    if(diffX>=0 && diffX<4 && diffY>=0 && diffY<4){
第五,您应该更改您的初始通话:

perm(0,0,0);
为此:

    if(diffX>=0 && diffX<3 && diffY>=0 && diffY<3){
perm(1,1,0);

按照您的方式,您总是强制将移动到左上角作为第一步。修改后的方式将0保持在中间,因此它不会强制您的第一步。当我运行此代码并进行所有修改时,它发现了3个解决方案。当我进一步修改代码以检查任何深度的解决方案时,它将深度8的nd 2解决方案和深度9的nd 3解决方案。

不,它不起作用,在书中写道,它可以在50个步骤中找到15个谜题的解决方案,但我在网上找不到任何东西。那么它怎么不起作用呢?你能给我们的关于你的问题的更多细节他会更好。例如,它能构建吗?如果不能,请编辑您的问题是包含完整的生成日志。它会崩溃吗?然后请在调试器中运行它,并至少为我们提供一个函数调用堆栈。它会给出错误的结果吗?那么对于某些指定的输入,实际和预期的输出是什么。您不能期望我们只阅读这么多代码(您也可以将其缩小到有问题的部分吗?),并且绝对不要运行它。您的
isReady
函数应该比较二维数组,而不是线性化数组。(或者,您可以使用所需解决方案的副本
memcmp
)另外,检查你的索引:4可能应该是3。为什么你要按对角线移动?是的,它会生成并且不会崩溃,但是它找不到正确的组合,如果我删除print函数,它只是从操作系统返回答案,程序已经完成,如果print()在那里,它会打印很多组合(但不是正确的)通过
row
col
(作为函数参数)以及
c
r
(由
findCol/row
计算)的双重索引看起来也有点可疑。例如,在第一次迭代中,您将(0,0)与(1,1)交换,这是非法的移动。
perm(0,0,0);
perm(1,1,0);