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皇后问题的主要内容,如果未能解决你的问题,请参考以下文章