头像

欢迎来到我的博客

分享题解与总结

P1219 八皇后 Checker Challenge

image

image

思路:

1.ch[i]存放列下标

2.dfs(i)代表现在遍历第几行

合法判断:

三个一维数组,分别判断三个方向:

(1)(按行放置,则不用检查行冲突)

(2)lie[j]记录(任意一行的)第j列有没有放过棋子

(3)xie1[i-j+n]记录第i-j+n号主对角线有没有放过棋子

(4)xie2[i+j]记录第i+j号副对角线有没有放过棋子

#include<bits/stdc++.h>
#define MAXN 15
using namespace std;
int n,cnt,ch[MAXN],lie[MAXN],xie1[MAXN*2],xie2[MAXN*2];

void dfs(int i)
{
	if(i==n+1){
		cnt++;//合法方案 总数加一 
		if(cnt>3) return;//只输出前三种 
		for(int k=1;k<=n;++k){
			printf("%d ",ch[k]);
		}
		printf("\n");
		return ; 
	}
	for(int j=1;j<=n;++j){
		if(lie[j]||xie1[i-j+n]||xie2[i+j]) continue;
		lie[j]=1,xie1[i-j+n]=1,xie2[i+j]=1;
		ch[i]=j;
		dfs(i+1);
		lie[j]=0,xie1[i-j+n]=0,xie2[i+j]=0;
		ch[i]=0;
	}
}

int main()
{
	cin>>n;
	dfs(1);
	cout<<cnt;
	return 0;
}
posted @ 2026-02-12 10:48  king_steph1209  阅读(13)  评论(0)    收藏  举报