走进“深度搜索基础训练“,踏入c++算法殿堂(一)

小航走入赛场,比赛即将开始……

主持人:欢迎来到深度搜索基础训练的比赛现场。首先,感谢全心全意为我们挖坑、绞尽脑汁出难题的出题老师们;然后,感谢古灵精怪的农夫John;最后,感谢c++……废话少说,比赛开始!

小航看向第一题……


【搜索与回溯算法】N皇后问题

时间限制: 1000 ms 空间限制: 262144 KB 具体限制

题目描述:

在一个nXn的国际象棋棋盘上放置n(n<=12)个皇后,使它们不能互相攻击(即任意两个皇后不能在同一行、同一列或同一对角线上)。试求出所有方法。

输入:

输入一个数n .(n<=12)

输出:

输出所有的排列方案总数。

样例输入:

4

样例输出:

2

“思路是:循环行,一列一列地试……”小航想道。接着,写下了代码。

#include<iostream>
using namespace std;
int a[105],b[105],c[105],n,s;//数组a为判断列是否放置皇后,b、c都是判断对角线是否放置皇后
void dg(int x)//循环行
{
	for(int i=1;i<=n;i++)//循环列
	{
		if(a[i]!=1&&b[x+i]!=1&&c[i-x+n-1]!=1)
		{
			a[i]=1;
			b[i+x]=1;
			c[i-x+n-1]=1;//上面两步及这步都是标记
			if(x==n)
			{
				s++;//当放到最后一个,方案数增加
			}
			else
			{
				dg(x+1);//进入下一行放置
			
			}	
                a[i]=0;
				b[i+x]=0;
				c[i-x+n-1]=0;//回溯
		} 
	} 
}
int main()
{
	cin>>n;
	dg(1);
	cout<<s;//输出方案数
}

        小航很快就把第一道题做完了,准备迎接下一题……

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_L.Y.H._

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值