搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。
--百度百科
搜索树的概念:
将搜索过程中每一步的状态变成树的一个节点,根节点为初始状态,搜索便是不断遍历这棵树,直到找到目标状态为止。
DFS主要算法过程:对于一个在有效的范围内的状态A,对于其所有的子状态,选择一种进行搜索,递归这一子状态,直到达到叶子节点,然后回溯到父亲节点,对另一种子状态进行搜索。
伪代码:
void DFS(状态A){
if(A不合法)
return;
if(A为目标状态)
输出
if(A不为目标状态)
DFS(A+i);//递归调用
}
实例 李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)
代码如下:
int ans=0;
char s[15];
void dfs(int a,int b,int jiu,int sum){
if(!jiu&&!a&&!b&&s[14]=='b'){//检索成功的条件。
ans++;
return;
}
if(a>0){//递归调用
s[sum]='a';
dfs(a-1,b,jiu*2,sum+1);
}
if(b>0&&jiu>0){
s[sum]='b';
dfs(a,b-1,jiu-1,sum+1);
}
}
int main(){
int jiu=2;
int a=5;
int b=10;
int sum=0;
dfs(a,b,jiu,sum);
printf("%d\n",ans);
return 0;
}
运行结果:14
六角填数
如图【1.png】所示六角形中,填入1~12的数字。使得每条直线上的数字之和都相同。图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?请通过浏览器提交答案,不要填写多余的内容。
代码如下:
#include<stdio.h>
int mun[9]={2,4,5,6,7,9,10,11,12};//只剩九个数未填
int vis[9];
int a[9];
int check(){
int t1,t2,t3,t4,t5,t6;
t1=1+a[2]+a[4]+a[8];
t2=1+a[1]+a[5]+a[9];
t3