八皇后 P1219 自己代数据都对,但是从n=5开始运行到一半就会返回3221225477 (网上说是读或写了野指针指向的内存) 实在是找不出问题,请大佬们帮忙看下 奉上代码:
#include <bits/stdc++.h>
#define int ll
using ll=long long;
using namespace std;
int n,b[107],a[107][107],cnt;
void seta(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=1;
}
void cap(int x,int i){ //占位
if(x < 1 || x > n || i < 1 || i > n) return; // 检查是否越界
for(int j=1;j<=n;j++){
a[x][j]=0;
a[j][i]=0;
}
for(int j=0,k=0;(x+j)<=n&&(i+k)<=n;k++,j++)a[x+j][i+k]=0;
for(int j=0,k=0;(x-j)<=n&&(i+k)<=n;k++,j++)a[x-j][i+k]=0;
for(int j=0,k=0;(x-j)>=1&&(i-k)>=1;j++,++k)a[x-j][i-k]=0;
for(int j=0,k=0;(x+j)>=1&&(i-k)>=1;j++,++k)a[x+j][i-k]=0;
}
void dfs(int x){ //x=层数
if(x>n){
cnt++;
if(cnt<=3){
for(int i=1;i<=n;++i){
printf("%d",b[i]);
if(i!=n){
putchar(' ');
}
}
putchar('\n');
}
return;
}
for(int i=1;i<=n;i++){
if(a[x][i]){ //合法
b[x]=i; //记录答案
cap(x,i);
dfs(x+1);
}
}
return;
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){ //从第一层开始
seta();
b[1]=i;
cap(1,i);
dfs(2);
}
printf("%d",cnt);
return 0;
}