0分求助QAQ(悬关)
查看原帖
0分求助QAQ(悬关)
1180231
H_dream楼主2024/6/9 10:44

从第一层到第nn层依次枚举
但是每次到底后会直接回到第一层,遍历下一个
结果一个解都没有(输出0)

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=20;
int n,ans[N],sum;
bool a[N][N];
bool check(){								//检查是否无处可填 
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(!a[i][j]) return 0;
	return 1;
}
void dfs(int x,int y){
	ans[x]=y;
	if(check()) return ;
	if(x==n){								//如果满了 
		if(sum<3){
			for(int i=1;i<=n;++i)
				printf("%lld ",ans[i]);
			cout<<endl;
		}
		sum++;
		return ;
	}
	for(int i=1;i<=n;++i){					//行和列 
		a[x][i]=1, a[i][y]=1;
	}
	int i=x,j=y;							//对角线1 
	while(i>0&&i<=n&&j>0&&j<=n){
		a[i][j]=1;
		i++, j++;
	}
	i=x,j=y;
	while(i>0&&i<=n&&j>0&&j<=n){
		a[i][j]=1;
		i--, j--;
	}
	i=x,j=y;								//对角线2 
	while(i>0&&i<=n&&j>0&&j<=n){
		a[i][j]=1;
		i++, j--;
	}
	i=x,j=y;
	while(i>0&&i<=n&&j>0&&j<=n){
		a[i][j]=1;
		i--, j++;
	}
	/*
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j)
			printf("%d ",a[i][j]);
		printf("\n");
	}
	cout<<endl;
	*/
	for(int i=1;i<=n;++i){					//遍历下一层 
		if(!a[x+1][i]){
			dfs(x+1,i);
		}
	}
	return ;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;++i){					//遍历第一层 
		dfs(1,i);
		/* 
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j)
				printf("%d ",a[i][j]);
			printf("\n");
		}
		cout<<endl;
		*/
		for(int j=1;j<=n;++j)				//更新数组 
			for(int k=1;k<=n;++k) a[j][k]=0;
	}
	cout<<sum;
	return 0;
}
2024/6/9 10:44
加载中...