普及1N皇后求调

#### N皇后

题目ID:8016必做题100分

最新提交:

Wrong Answer

36 分

历史最高:

Wrong Answer

36 分

> 时间限制: 1000ms
>
>
>
> 空间限制: 32000kB

### 题目描述

#### **时间限制:1s 空间限制:32M**

#### **题目描述:**

检查一个如下的6∗66∗6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

![image.png](https://oss.aws.turingstar.com.cn/e93e978d-84ba-432c-bdbb-647df9919628)

上面的布局可以用序列246135246135来描述,第�i个数字表示在第�i行的相应位置有一个棋子,如下:

行号 123456123456

列号 246135246135

这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前33个解。最后一行是解的总个数。

#### **输入格式:**

一个数字�N 表示棋盘是 �∗�N∗N 大小的,要放�N个皇后。(6≤ �≤ 13)(6≤ n≤ 13)

#### **输出格式:**

前三行为前三个解,每个解的两个数字之间用一个空格隔开。

第四行只有一个数字,表示解的总数。

#### **样例输入1:**

6


#### **样例输出1:**

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

#include<bits/stdc++.h>
using namespace std;
struct c{
	int bh, sx;
	bool zt;
}vc[14] = {c{0, 0, false}};
int n, cnt = 0;
bool vx[36] = {false}, vy[36] = {false};
bool cmp(c a, c b){
	return a.bh < b.bh;
}
void dfs(int x){
	if (x > n){
		sort(vc + 1, vc + 1 + n, cmp);
		cnt++;
		if (cnt <= 3){
			for (int i = 1;i <= n;i++){
				cout << vc[i].sx << ' ';
			}
			cout << endl;		
		}
	
	}
	else{
		for (int i = 1;i <= n;i++){
			if (!(vc[i].zt || vx[n-x+i] || vy[x+i-1])){
				vc[i].zt = true;
				vc[i].bh = x;
				vc[i].sx = i;
				vx[n-x+i] = true;
				vy[x+i-1] = true;
				dfs(x + 1);
				vc[i].zt = false;
				vx[n-x+i] = false;
				vy[x+i-1] = false;
			}
		} 
	}
}
int main(){
	cin >> n;
	dfs(1);
	cout << cnt;
	return 0;
}
1 个赞

N皇后是基础的吧。。。
屏幕截图 2025-04-01 212400

if(x>n){
        cnt++;
    	return;
	}

这题不用sort
@潘柯翰 @潘柯翰 人呢改完AC
watermelon
吃瓜等待孑孓人呢人呢????
算了ta今天可能不在

1 个赞

ok,A了

1 个赞

@吴兮尧 还有一道
样例: 输入6
输出 2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

1 个赞

也是N皇后

1 个赞

普及1的

1 个赞

o
帖子必须至少为 2 个字符

你会吗?

1 个赞

没做过