C++ 我的变量";";正在自行递减,甚至不提供递减操作。C++;-N_Queen_问题计划

C++ 我的变量";";正在自行递减,甚至不提供递减操作。C++;-N_Queen_问题计划,c++,algorithm,recursion,backtracking,n-queens,C++,Algorithm,Recursion,Backtracking,N Queens,这是我创建的NQueen的代码。很少有操作像调用nqueen函数,然后从nqueen->calling backtrack执行递归并将值“1”放在动态分配的数组“arr”上。 问题是,由于我在main中初始化了变量“n”,并将其传递到nqueen&从nqueen到backtrack,有时为了打印最终创建的完整nqueen数组,“n”被传递到print函数。在每个递归调用中,“n”的值都在减小,在一些递归调用中也是如此,但我没有提供递减操作 这是主函数,调用nqueen func传递“n”=4->

这是我创建的NQueen的代码。很少有操作像调用nqueen函数,然后从nqueen->calling backtrack执行递归并将值“1”放在动态分配的数组“arr”上。 问题是,由于我在main中初始化了变量“n”,并将其传递到nqueen&从nqueen到backtrack,有时为了打印最终创建的完整nqueen数组,“n”被传递到print函数。在每个递归调用中,“n”的值都在减小,在一些递归调用中也是如此,但我没有提供递减操作

这是主函数,调用nqueen func传递“n”=4->

intmain(){
int n=4;
整数**arr=新整数*[n];
对于(inti=0;i,正如Jarod42所写:

您调用backtrack(arr,i,j)…所以int backtrack(int**arr,int i,int n)中的n将是j,但main中的n不变

由于递归调用,您正在观看另一个(=本地)“n”

但如果我执行此操作,我也会得到一个SEGFULT。您使用I的值“4”调用check函数。该函数将使用行中的无效偏移量访问arr:

if(arr[i][k]==1) return 1;
对于大小为4的数组,有效值仅从0到3。 编辑:当然,i是4,因为在进行递归调用之前,它是
i++
,没有任何检查它是否会变得更高。我真的不明白这段代码的目的是什么,所以也许检查i和j是否有效就足够了,如果不有效就停止。

正如Jarod42所写:

您调用backtrack(arr,i,j)…所以int backtrack(int**arr,int i,int n)中的n将是j,但main中的n不变

由于递归调用,您正在观看另一个(=本地)“n”

但如果我执行此操作,我也会得到一个SEGFULT。您使用I的值“4”调用check函数。该函数将使用行中的无效偏移量访问arr:

if(arr[i][k]==1) return 1;
对于大小为4的数组,有效值仅从0到3。
编辑:当然,i是4,因为在进行递归调用之前,它是
i++
,没有任何检查它是否会变得更高。我真的不明白这段代码的目的是什么,所以也许检查i和j是否有效就足够了,如果不有效就停止。

你调用
回溯(arr,i,j)
…所以
n
from
int backtrack(int**arr,int i,int n)
将是
j
,但是main中的
n
是不变的。您调用
backtrack(arr,i,j)
所以
n
from
int backtrack(int**arr,int i,int n)
应该是
j
,但是main中的
n
没有改变。哦,那是一个错误。感谢Jarod指出,分割错误也是通过改变j和n来修复的。现在代码运行良好。哦,那是一个错误。感谢Jarod指出,分割错误也是通过changin修复的现在代码运行良好。
int backtrack(int** arr,int i,int n){
    if(i==n) return 0;
    int count=0;
    for(int j=0;j<n;j++){
      if(check(arr,i,j,n)==0){
        arr[i][j]=1;
            cout<<"\n"<<i<<" "<<j<<" "<<n<<endl;
            print(arr,n);
        i++;
        count+=backtrack(arr,i,j);
        i--;
        arr[i][j]=0;
       }
     }
    return count;
}
#include<iostream>
using namespace std;


int nqueen(int** arr,int n);
void print(int** arr,int n);
int backtrack(int** arr,int i,int n);
int check(int** arr,int i,int j,int n);

int backtrack(int** arr,int i,int n){
if(i==n) return 0;
int count=0;
for(int j=0;j<n;j++){
    if(check(arr,i,j,n)==0){
        arr[i][j]=1;
            cout<<"\n"<<i<<" "<<j<<" "<<n<<endl;
            print(arr,n);
        i++;
        count+=backtrack(arr,i,j);
        i--;
        arr[i][j]=0;
    }
}
return count;
}

int nqueen(int** arr,int n){
int count=0;
for(int i=0;i<n;i++){
    count+=backtrack(arr,i,n);
}
return count;
}

int check(int** arr, int i,int j,int n){
/////check vertical horizontal
for(int k=0;k<n;k++){
    if(arr[i][k]==1) return 1;
    if(arr[k][j]==1) return 1;
}
/////check diagonal
int k=i,l=j;
while(k<n&&l<n){
    if(arr[k][l]==1){
        return 1;
    }
    k++;
    l++;
}

k=i,l=j;
while(k>=0&&l>=0){
    if(arr[k][l]==1){
        return 1;
    }
    k--;
    l--;
}

k=i,l=j;
while(k>=0&&l<n){
    if(arr[k][l]==1){
        return 1;
    }
    k--;
    l++;
}

k=i,l=j;
while(k<n&&l>=0){
    if(arr[k][l]==1){
        return 1;
    }
    k++;
    l--;
}

return 0;
}

void print(int** arr,int n){
cout<<endl;
for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
        cout<<arr[i][j]<<" "<<i<<j<<" ";
    }
    cout<<endl;
}
}

int main(){
int n=4;
int** arr=new int*[n];
for(int i=0;i<n;i++){
    arr[i]=new int[n];
}
for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
        arr[i][j]=0;
    }
}
print(arr,n);
int num=nqueen(arr, n);
cout<<num<<endl;

return 0;
}
if(arr[i][k]==1) return 1;