目录
本文我们来讲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