N皇后(递归算法)

问题描述: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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值