搜索与回溯的复习

搜索与回溯的复习

今天

我爸找了个机会

带我复习了一下搜索与回溯

在这里插入图片描述
搜索与回溯虽然有一定难度

不过搜索与回溯有一个优点

就是套路

直接把模板往上套就可以了

下面上模板:

1、

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

2、

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

搜索与回溯大部分的题

都是将模板套上去

就可以了

搜索与回溯

其实就是将这道题所有的可能全部都试一遍

如果走到底了

就输出

再向前回溯一步

更换一条路线

只要熟悉了套路

就非常的简单

下面我来举几个例子:

【例1】素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。

【算法分析】
非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。

【算法流程】
1、数据初始化; 2、递归填数:判断第i个数填入是否合法;
A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个;
B、如果不合法:选择下一种可能;

上面这就是一个典型的例子

按照上面的写法

这个程序

会把所有的数字都试一遍

一旦填完了

就输出

再向前回溯一步

一点一点算

会把所有的可能全部都试一遍

最后再输出
【例2】任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14

这道题同样也是的

也是将所有的可能性都试一遍

但是要注意一点

必须保证后一项

大于等于前一项

这样才能不重复

——————————————结束分割线——————————————

这就是我的感想

达瓦里氏们
苏卡不列!!
发布了24 篇原创文章 · 获赞 0 · 访问量 609

猜你喜欢

转载自blog.csdn.net/zliang_ma/article/details/104521959