八皇后问题
2017-10-07 21:33:16
writer;pprp
经典的回溯算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include<cstring> #include<iostream> using namespace std; int vis[3][15],tot; void search( int cur) { int i,j; if (cur==8) tot++; else { for (i=0;i<8;i++) { if (!vis[0][i]&&!vis[1][cur-i+8]&&!vis[2][cur+i]) { vis[0][i]=1; vis[1][cur-i+8]=1; vis[2][cur+i]=1; search(cur+1); //改回辅助的全局变量 vis[0][i]=0; vis[1][cur-i+8]=0; vis[2][cur+i]=0; } } } } int main() { search(0); cout<<tot<<endl; } |
第二种
/*
@theme:搜索入门:回溯算法 - 八皇后问题
@writer:pprp
@declare:
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int num;
int sum;
int *x;
bool place(int k)////检测前k个已经确定的点是否会与当前点进行冲突
{
for(int i = 1 ; i < k ; i++)
if(abs(x[k]-x[i]) == abs(k-i)||x[i] == x[k])
return false;
return true;
}
void backtrack(int t)
{
if(t > num)
{
sum++;
for(int i = 1; i <= num ; i++)
{
cout <<'('<< i <<',' << x[i] << ')';
}
cout << endl;
}
else
for(int i = 1; i <= num ; i++)
{
x[t] = i;
if(place(t))
backtrack(t+1);
}
}
int main()
{
num = 8;
sum = 0;
x = new int[num+1];
for(int i = 0; i <= num ; i++)
x[i] = 0;
backtrack(1);
cout << sum << endl;
delete []x;
return 0;
}
回溯算法的构架
非递归:
1: int a[n],i;
2: 初始化数组a[];
3: i = 1;
4: while (i>0(有路可走) and (未达到目标)) // 还未回溯到头
5: {
6: if(i > n) // 搜索到叶结点
7: {
8: 搜索到一个解,输出;
9: }
10: else // 处理第i个元素
11: {
12: a[i]第一个可能的值;
13: while(a[i]在不满足约束条件且在搜索空间内)
14: {
15: a[i]下一个可能的值;
16: }
17: if(a[i]在搜索空间内)
18: {
19: 标识占用的资源;
20: i = i+1; // 扩展下一个结点
21: }
22: else
23: {
24: 清理所占的状态空间; // 回溯
25: i = i –1;
26: }
27: }
递归:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 1: int a[n]; 2: try ( int i) 3: { 4: if (i>n) 5: 输出结果; 6: else 7: { 8: for (j = 下界; j <= 上界; j=j+1) // 枚举i所有可能的路径 9: { 10: if (fun(j)) // 满足限界函数和约束条件 11: { 12: a[i] = j; 13: ... // 其他操作 14: try (i+1); 15: 回溯前的清理工作(如a[i]置空值等); 16: } 17: } 18: } 19: } |
代码改变世界
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)