问题描述:N皇后问题是一个以国际象棋为背景的问题:如何能够在 n*n 的国际象棋棋盘上放置N个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。输入n,有多少种摆放的情况?
此题是我第一次接触递归算法的题目
第一行输入测试次数t;
输入测试的行数,输出总数
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10 724
11 2680
12 14200
13 73712
14 365596
15 2279184
16 14772512
17 95815104
18 666090624
19 4968057848
20 39029188884
21 314666222712
22 2691008701644
23 24233937684440
24 227514171973736
25 2207893435808352
代码实现
#include<bits/stdc++.h>
using namespace std;
int c=0;
int cheak(int x[],int nowhang)
{
//判断是否在同一列,在对角
int i;
for(i=1;i<nowhang;i++)
if(x[i]==x[nowhang]||fabs(i-nowhang)==fabs(x[i]-x[nowhang]))
return 0;
return 1;
}
void queen(int n,int x[],int now)
{
//从第一行开始x=1
int i;
for(i=1;i<=n;i++)
{
x[now]=i;//每一次从第一列开始往最后一列放
if(cheak(x,now)==1)
{
if(now==n)//放到最后一行,计数++
c++;
else
queen(n,x,now+1);//否则继续往下一行放
}
}
}
int main()
{
int t,n,x[25];
cin>>t;
while(t–)
{
cin>>n;
queen(n,x,1);
cout<<c<<endl;
c=0;
}
return 0;
}