回溯和分支限界详解和实例(八皇后问题,哈密顿回路解析和代码)


文章目录

    • 回溯和分支限界解决的问题
    • 回溯法的内涵
    • 回溯法的一些实例
      • n皇后问题
      • 哈密顿回路问题
      • 子集和数的问题
    • 分支限界法
      • 实例1:分配工作问题

回溯和分支限界解决的问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

回溯法的内涵

在这里插入图片描述

回溯法的一些实例

n皇后问题

在这里插入图片描述

在这里插入图片描述
这棵树实际上是对称的所以不用画后面的位于3 4 格开始的情况也可以得到其他解

伪代码如下
在这里插入图片描述
在这里插入图片描述

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
#include<math.h>
int x[15]={0};
int count=0;
int PLACE(int k)//检测第k个皇后能否放进棋盘
{
    int i=1;
    while(i<k)
    {
        if(x[i]==x[k]||fabs(x[i]-x[k])==fabs(i-k))
            return 0;
        i++;
    }
    return 1;
}
void NQUEENS(int n)
{
    int k=1; //k为当前行号
    x[1]=0;//x[k]为第k行皇后所放的列号
    while(k>0)
    {
        x[k]++;
        while(x[k]<=n&&!PLACE(k))//该列不符合,则放入下一列
          x[k]++;
        if(x[k]<=n)
        {
            if(k==n)
            {
                count++;
                if(count==4)
                {
                    printf("%d\n",count);
                    break;
                }
               printf("%d %d %d %d %d %d\n",x[1],x[2],x[3],x[4],x[5],x[6]);    
            }

            else//判断下一行
            {
                k++; x[k]=0;
            }
        }
        else k--;//没找到,则回溯
    }
    return ;
}
int main()
{
    int n;
    while(scanf("%d",&n)&&n!=0)
    {
         NQUEENS(n);
   
    count =0;
    }
    return 0;
}

哈密顿回路问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

子集和数的问题

在这里插入图片描述
在这里插入图片描述

分支限界法

在这里插入图片描述

实例1:分配工作问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述