C++知识精讲1——八个皇后(搜索与回溯)

目录

搜索与回溯基本框架 

搜索与回溯基本框架一

搜索与回溯基本框架二

八皇后代码解析

八皇后代码一

代码一输出结果

八皇后代码二 

代码二输出结果

小结 


本文我们来讲C++知识精讲的第1篇,八个皇后,此专栏会讲许多,各种各样的类型,如果喜欢此专栏请订阅持续关注,感谢大家的支持。接下来,进入今天的知识精讲。

搜索与回溯基本框架 

---------------------------------------------------------------------------------------------------------------------------------

搜索与回溯基本框架一

int search(int k)
{
	for(i=1;i<=算符种数;i++)
	if(满足条件)
	{
        保存结果
        if(到达目的地)输出解;
        else search(k+1);
        恢复:保存结果之前的状态{回溯一步}
	}
}

---------------------------------------------------------------------------------------------------------------------------------

搜索与回溯基本框架二

int search(int k)
{
	if(到达目的地)输出解;
	else
	for(i=1;i<=算符种数;i++)
	if(满足条件)
	{
        保存结果
        search(k+1);
        恢复:保存结果之前的状态{回溯一步}
	}
}

-------------------------------------------------------------------------------------------------------------------------------- 

八皇后代码解析

int search(int i){
	int j;
	for(j=1;j<=8;j++)                      //每个皇后都有8个位置(列)可以试放
	if((!b[j])&&(!c[i+j])&&(!d[i-j+7]))    //寻找放置后皇后的位置由于c++不能操作负数组,因此考虑+7
{
  a[i]=j;                                  //放置皇后
		b[j]=1;                            //宣布占领第j列
		c[i+j]=1;                          //占领两个对角线
		d[i-j+7]=1;
		if(i==8)print();                   //八个皇后都放置好,输出
		else search(i+1);                  //继续递归放置下一个皇后
		b[j]=0;                            //递归返回即为回溯一步,当前皇后退出
		c[i+j]=0;
		d[i-j+7]=0;
	}
}
int print()
{
	int i;
	sum++;                                //方案数累加一
	cout<<"sun="<<sum<<endl;
	for(i=1;i<=8;i++)                       //输出一种方案
	cout<<setw(4)<<a[i];
	cout<<endl;
}

---------------------------------------------------------------------------------------------------------------------------------

八皇后代码一

#include<bits/stdc++.h>
using namespace std;
bool d[16]={0},b[9]={0},c[16]={0};
short tot,sum,a[9];
int search(int);
int print();
int main()
{
	//tot=0;
	search(1);
	//cout<<tot;
}
int search(int i){
	int j;
	for(j=1;j<=8;j++)
	if((!b[j])&&(!c[i+j])&&(!d[i-j+7]))
	{
		a[i]=j;
		b[j]=1;
		c[i+j]=1;
		d[i-j+7]=1;
		if(i==8)print();
		else search(i+1);
		b[j]=0;
		c[i+j]=0;
		d[i-j+7]=0;
	}
//return 0;
}
int print()
{
	int i;
	sum++;//tot=tot+1;
	cout<<"sun="<<sum<<endl;
	for(i=1;i<=8;i++)
	cout<<setw(4)<<a[i];
	cout<<endl;
	//return 0;
}

-------------------------------------------------------------------------------------------------------------------------------- 

代码一输出结果

sun=1
   1   5   8   6   3   7   2   4
sun=2
   1   6   8   3   7   4   2   5
sun=3
   1   7   4   6   8   2   5   3
sun=4
   1   7   5   8   2   4   6   3
sun=5
   2   4   6   8   3   1   7   5
sun=6
   2   5   7   1   3   8   6   4
sun=7
   2   5   7   4   1   8   6   3
sun=8
   2   6   1   7   4   8   3   5
sun=9
   2   6   8   3   1   4   7   5
sun=10
   2   7   3   6   8   5   1   4
sun=11
   2   7   5   8   1   4   6   3
sun=12
   2   8   6   1   3   5   7   4
sun=13
   3   1   7   5   8   2   4   6
sun=14
   3   5   2   8   1   7   4   6
sun=15
   3   5   2   8   6   4   7   1
sun=16
   3   5   7   1   4   2   8   6
sun=17
   3   5   8   4   1   7   2   6
sun=18
   3   6   2   5   8   1   7   4
sun=19
   3   6   2   7   1   4   8   5
sun=20
   3   6   2   7   5   1   8   4
sun=21
   3   6   4   1   8   5   7   2
sun=22
   3   6   4   2   8   5   7   1
sun=23
   3   6   8   1   4   7   5   2
sun=24
   3   6   8   1   5   7   2   4
sun=25
   3   6   8   2   4   1   7   5
sun=26
   3   7   2   8   5   1   4   6
sun=27
   3   7   2   8   6   4   1   5
sun=28
   3   8   4   7   1   6   2   5
sun=29
   4   1   5   8   2   7   3   6
sun=30
   4   1   5   8   6   3   7   2
sun=31
   4   2   5   8   6   1   3   7
sun=32
   4   2   7   3   6   8   1   5
sun=33
   4   2   7   3   6   8   5   1
sun=34
   4   2   7   5   1   8   6   3
sun=35
   
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楠山若芸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值