八皇后问题

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: }

  

 

posted @   pprp  阅读(231)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示