搜索与回溯的复习
今天
我爸找了个机会
带我复习了一下搜索与回溯
搜索与回溯虽然有一定难度
不过搜索与回溯有一个优点
就是套路
直接把模板往上套就可以了
下面上模板:
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
这道题同样也是的
也是将所有的可能性都试一遍
但是要注意一点
必须保证后一项
大于等于前一项
这样才能不重复
——————————————结束分割线——————————————
这就是我的感想