N皇后问题

试题描述
 在N*N的方格棋盘放置N个皇,使得它们不相互攻击(即任意2个皇后不允许处在同一行,或同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种符合要求放置方法。
输入
输入中有一个正整数N≤20,表示棋盘和皇后的数量 
输出
为一个正整数,表示N个皇后的不同放置方法数。 
输入示例
5
输出示例
10
 

回溯法。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 int queen[21];   //储存某一行的皇后在第几列 
 5 int n,ans;
 6 void search(int x)
 7 {
 8     if(x==n+1) ans++;   //全部搜索完毕 
 9     else
10     {
11         for(int i=1;i<=n;i++)   
12         {
13             queen[x]=i;   //第x行的皇后储存在第i列中 
14             bool f=true;
15             for(int j=1;j<x;j++)  //检查
16             {
17                 if(queen[x]==queen[j]/**/ || queen[j]==queen[x]-j+x /*正对角线*/|| queen[j]==queen[x]+j-x/*反对角线*/) {f=false;break;}   
18             }
19             if(f) search(x+1);   //如果一直没有退出,则说明在这个位置加一个皇后是没问题的,那么继续下一行 
20         }
21     }
22 }
23 int main()
24 {
25     scanf("%d",&n);
26     search(1);
27     printf("%d",ans);
28     //system("pause");
29     return 0;
30 }
N皇后问题
原文地址:https://www.cnblogs.com/YXY-1211/p/5685051.html