求救
  • 板块学术版
  • 楼主doujiamu
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/4/4 09:42
  • 上次更新2024/4/4 13:00:32
查看原帖
求救
947142
doujiamu楼主2024/4/4 09:42

八皇后 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;
}
2024/4/4 09:42
加载中...