n皇后问题

Posted hhyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n皇后问题相关的知识,希望对你有一定的参考价值。

# 题意

n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,任意两个皇后都不能处于同一行、同一列或同一斜线上。

技术图片

输出所有满足条件的皇后的摆法 

# 题解

从前往后枚举每一行,所以每一行只会放一个,用bool分别记录列、正对角线、反对角线,对角线用截距来表示,

正对角线y=x+b , b= y-x , b可能小于0,偏移量x-y+n

反对角线y=-x+b , b=y+x

 1 //u为行,i为列
 2 
 3 #include<iostream>
 4 #include<cstdio>
 5 using namespace std;
 6 const int N=20;
 7 char g[N][N];
 8 bool col[N],dg[N],udg[N];
 9 int n;
10 void dfs(int u){
11     if(u==n)
12     {
13         for (int i = 0; i <n ; ++i) puts(g[i]);
14         puts("");
15         return;
16     }
17     for (int i = 0; i <n ; ++i) {
18         if( !col[i] && !dg[u+i] && !udg[n-u+i] ){
19             g[u][i]=Q;
20             col[i]=dg[u+i]=udg[n-u+i]=true;
21 
22             dfs(u+1);
23 
24             col[i]=dg[u+i]=udg[n-u+i]=false;
25             g[u][i]=.;
26         }
27     }
28 }
29 int main(){
30     scanf("%d",&n);
31     for (int i = 0; i <n ; ++i)
32         for (int j = 0; j <n ; ++j)
33             g[i][j]=.;
34 
35     dfs(0);
36 
37     return 0;
38 }

 

以上是关于n皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

51. N 皇后

51. N 皇后

51. N 皇后

N皇后问题—初级回溯

八皇后问题求解的C语言程序的实现

N皇后问题