码迷,mamicode.com
首页 > 其他好文 > 详细

n皇后问题

时间:2020-03-03 12:47:55      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:题解   info   alt   scan   http   img   return   偏移量   ==   

# 题意

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皇后问题

标签:题解   info   alt   scan   http   img   return   偏移量   ==   

原文地址:https://www.cnblogs.com/hhyx/p/12401488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!