洛谷 1219 (八皇后)

八皇后问题DFS求解
本文详细解析了八皇后问题的深度优先搜索(DFS)算法实现,通过具体实例阐述了如何确保棋盘上的皇后彼此不受攻击,即每行、每列及对角线上的皇后数量不超过一个。代码示例清晰地展示了递归过程与冲突检测方法。

八皇后  (DFS)

洛谷p1219

题目描述

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

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

行号 1 2 3 4 5 6

列号 2 4 6 1 3 5

 

这道题其实理解了很简单,就是这个点放了棋子,四条线上不再能放棋子

注意:如果横坐标是x,纵坐标是y,那么斜着的坐标就分别是y+x,y-x+n(n代表棋盘的大小,n皇后)

    //如果无法理解,就画画图,自己就看出来了

 

我们把函数dfs的成员k看成点的横坐标

for循环里的 i 看做y坐标,直接纯dfs就可以写了

 1 void dfs(int k)
 2 {
 3     if(k==n+1)
 4     {
 5         ans++;
 6         if(ans<=3)
 7         {
 8             for(int i=1;i<=n;++i)
 9             {
10                 cout<<v[i]<<" ";
11             }
12             cout<<endl;
13         }
14 
15     }
16     else
17     {
18         for(int i=1;i<=n;++i)
19         {
20             if(b[i]==0&&c[i+k]==0&&d[i-k+n]==0)
21             {
22                 a[k]=1;
23                 b[i]=1;
24                 c[i+k]=1;
25                 d[i-k+n]=1;
26                 v[k]=i;
27                 dfs(k+1);
28                 a[k]=0;
29                 b[i]=0;
30                 c[i+k]=0;
31                 d[i-k+n]=0;
32             }
33         }
34     }
35 }

看着长,不难

    

 

转载于:https://www.cnblogs.com/jrfr/p/10501631.html

### 关于洛谷平台上的皇后问题的C++实现 #### 皇后的定义与背景 皇后问题是经典的回溯法应用之一,其目标是在8×8的棋盘上放置皇后,使得任意两个皇后都不能互相攻击。这意味着任何两个皇后都不可以在同一行、同一列或者同一条斜线上。 #### 使用回溯法求解皇后问题的核心思路 回溯法是一种通过逐步构建候选解并尝试扩展当前部分解的方法,在遇到不满足约束条件的情况时撤销最后一步操作并继续探索其他可能性的技术。对于皇后问题而言,可以通过逐行放置皇后的方式,并利用数组记录每列以及两条对角线的状态来判断当前位置是否合法[^1]。 下面提供一种基于上述原理的C++程序实现: ```cpp #include <iostream> using namespace std; const int N = 8; int col[N], d1[2 * N], d2[2 * N]; int ans[N][N]; void printSolution() { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (ans[i][j]) cout << "Q "; else cout << ". "; } cout << endl; } } bool solve(int row) { if (row == N) { // 如果已经处理到第9行,则找到了一个解 return true; } for (int i = 0; i < N; ++i) { if (!col[i] && !d1[row - i + N - 1] && !d2[row + i]) { ans[row][i] = 1; col[i] = d1[row - i + N - 1] = d2[row + i] = 1; if (solve(row + 1)) return true; ans[row][i] = 0; col[i] = d1[row - i + N - 1] = d2[row + i] = 0; } } return false; } int main(){ memset(col, 0, sizeof(col)); memset(d1, 0, sizeof(d1)); memset(d2, 0, sizeof(d2)); bool found = solve(0); if(found){ printSolution(); }else{ cout<<"No solution exists"<<endl; } return 0; } ``` 该代码片段实现了基本的皇后解决方案,其中`col[]`, `d1[]`, 和 `d2[]`分别用来标记某列和两种类型的对角线是否有皇后存在。当递归调用`solve()`函数到达最后一行时即表示成功找到一组可行解[^2]。 #### 结论 以上方法展示了如何运用回溯技术有效解决皇后这一经典难题。这种方法不仅适用于标准尺寸(8x8),还可以轻松调整大小参数以适应不同规模的问题实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值