酒泉市网站建设_网站建设公司_模板建站_seo优化
2026/1/17 13:45:16 网站建设 项目流程

【题目来源】
https://www.luogu.com.cn/problem/P1219

【题目描述】
一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

P1219

上面的布局可以用序列 2 4 6 1 3 5 来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 3 个解。最后一行是解的总个数。

【输入格式】
一行一个正整数 n,表示棋盘是 n×n 大小的。

【输出格式】
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。​​​​​​​

【输入样例】
6

【输出样例】
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4​​​​​​​

【数据范围】
对于 100% 的数据,6≤n≤13。

【算法分析】
● 在二维矩阵中,主对角线和副对角线是两种基本的对角线方向。
(1)主对角线‌
方向与特点‌:从矩阵的‌左上角‌延伸至‌右下角‌。
元素位置‌:位于主对角线上的所有元素,其行号(row)与列号(col)‌相等‌,即 row==col。这也是其最常见的判定方式。
公式应用‌:在编程中(例如解决八皇后问题),常用 row-col 的值来标识唯一的主对角线,因为同一主对角线上的 row-col 是一个常数。
(2)副对角线
方向与特点‌:从矩阵的‌右上角‌延伸至‌左下角‌。它也称为‌反对角线‌或‌次对角线‌。
元素位置‌:位于副对角线上的所有元素,其行号与列号之和为‌定值‌。对于一个 n×n 的方阵,这个定值通常是 n-1,即 row+col==n-1。
公式应用‌:在编程中,常用 row+col 的值来标识唯一的副对角线,因为同一副对角线上的 row+col 也是一个常数。​​​​​​​

● 判断逻辑基于以下三个条件:

if(col[colIdx] || dg[row+colIdx] || udg[n-row+colIdx]) {continue;
}

(1)列冲突检查‌:col[colIdx]
若为 true,表示第 colIdx 列已被其他行的皇后占用,当前位置不安全。
(2)主对角线冲突检查‌:dg[row+colIdx]
若为 true,表示当前 (row, colIdx) 所在的主对角线(左上到右下方向)已被占用。该方向上的所有点满足 行索引 - 列索引 = 常数。使用 row+colIdx 作为标识键,是为了避免差值为负的情况,方便数组索引。
(3)副对角线冲突检查‌:udg[n-row+colIdx]
若为 true,表示当前 (row, colIdx) 所在的副对角线(右上到左下方向)已被占用。该方向上的所有点满足“行索引+列索引=常数”。使用 n-row+colIdx 作为标识键,同样是为了将常数映射到非负的数组索引范围。

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int N=20;
bool dg[N<<1]; //principal diagonal
bool udg[N<<1]; //counter diagonal
int pos[N]; //Record column number where queen is placed
bool col[N];
int cnt;
int n;void print() {for(int i=1; i<=n; i++) {cout<<pos[i]<<" ";}cout<<endl;
}void dfs(int row) {if(row>n) {cnt++;if(cnt<=3) print();return;}for(int colIdx=1; colIdx<=n; colIdx++) {if(col[colIdx] || dg[row+colIdx] || udg[n-row+colIdx]) {continue;}pos[row]=colIdx;col[colIdx]=dg[row+colIdx]=udg[n-row+colIdx]=true;dfs(row+1); //Search the next linecol[colIdx]=dg[row+colIdx]=udg[n-row+colIdx]=false; //traceback}
}int main() {cin>>n;dfs(1);cout<<cnt<<endl;return 0;
}/*
in:
6out:
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
*/





【参考文献】
https://blog.csdn.net/Demilly123/article/details/127721176
https://www.luogu.com.cn/problem/solution/P1219
https://www.cnblogs.com/qiuliw/p/18760573
https://www.cnblogs.com/Kyriech-Francis/p/Answer_P1219.html




 

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询