只过了三个点,求大佬帮助
查看原帖
只过了三个点,求大佬帮助
212172
Dubhe_楼主2021/12/7 14:02
#include<bits/stdc++.h>
using namespace std;
int Map[15][15];
//用来保存当前的局势
int a[15];
//a数组用来保存当前的一个解 
bool c=0;
//用来检查答案是否合格 
int n,m,ans; //n是棋盘的大小
int check(int x,int y){
	//用来检查第x行第y列当前是否能放下 
	int ret=1;
	for(int i=x,j=y;i>=1,j<=n;i--,j++){
		if(Map[i][j]==1) ret=0;
	}
	for(int i=x,j=y;i<=n,j>=1;i++,j--){
		if(Map[i][j]==1) ret=0;
	}
	for(int i=x,j=y;i>=1,j>=1;i--,j--){
		if(Map[i][j]==1) ret=0;
	}
	for(int i=x,j=y;i<=n,j<=n;i++,j++){
		if(Map[i][j]==1) ret=0;
	}	
	//用来判断左右对角线上有无棋子
	for(int i=1;i<=n;i++){
		if(Map[x][i]==1) ret=0;
		if(Map[i][y]==1) ret=0;
	}
	//判断行列上有无元素
	return ret;
}
void print(){
	if(m>=3){
		ans++;
		return;
	}
	//只有小于3才输出,否则就只增加答案 
	m++;
	ans++;
	for(int i=1;i<=n;i++){
		printf("%d ",a[i]);
	}
	cout<<endl;
}
void search(int k){
	//搜索当前第k行的摆放情况
	if(k>n){
		//如果已选完就输出 
		print();
		return;
	}
	for(int i=1;i<=n;i++){
		if(check(k,i)){
			//如果满足条件,就选这个位置 
			Map[k][i]=1;
			a[k]=i;
			//选中一个以后就继续搜下一行
			search(k+1);
			Map[k][i]=0;
			//回溯
		}
	}
}
int main(){
	cin>>n;
	search(1);
	cout<<ans;
}

实在是不知道哪出问题了,真的是吐了。 前三个测试点过了,9以后的答案就比标准答案少一些

2021/12/7 14:02
加载中...