回溯算法是深度优先搜索的一种
回溯算法不要求保存完整的搜索树“
回溯算法是一种尝试所有可能直到找到一条正确路径的算法
代码的实现样例
void dfs(int n)
{
if(到达目标)输出;
for(int i = 0;i < n;i++){
if(满足条件){
保存;
dfs(next);
//相当于下一个点不满足条件,所以需要回溯
回溯;
}
}
}
`
在这里插入代码片
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int map[21][4];
int vis[21];
int output[21];
int kase = 0;
int n;
void dfs(int now,int cur)
{
if(cur == 20){
if(map[now][0] == n || map[now][1] == n||map[now][2] == n){ //表示回到了原点
printf("%d: " ,++kase);
for(int i = 0;i < 20;i++){
printf("%d ",output[i]);
}
printf("%d\n",n); //最后一个输出换行不输出空格
}
}
for(int i = 0;i < 3;i++){
int temp = map[now][i];
if(vis[temp] == 0){
vis[temp] = 1;
output[cur] = temp;
dfs(temp,cur + 1); //并没改变cur的值
vis[temp] = 0; //取消的是邻接点的标记!!!就是退一步,下一步的状态变回原样
}
}
}
int main()
{
for(int i = 1;i <= 20;i++){
int a[4];
cin>>a[0]>>a[1]>>a[2];
sort(a,a + 3);
map[i][0] = a[0];
map[i][1] = a[1];
map[i][2] = a[2];
}
while(cin>>n){
if(n == 0)break;
memset(vis,0,sizeof(vis));
vis[n] = 1;
output[0] = n;
kase = 0;
dfs(n,1);
}
}
//和上面的递归对比加深对递归的理解
int num = 1;
void dfs1(int now)
{
//满足目标输出
if(num == 20){
if(map[now][0] == n || map[now][1] == n||map[now][2] == n){ //表示回到了原点
printf("%d: " ,++kase);
for(int i = 0;i < 20;i++){
printf("%d ",output[i]);
}
printf("%d\n",n); //最后一个输出换行不输出空格
}
}
//尝试所有可能性
for(int i = 0;i < 3;i++){
int temp = map[now][i];
if(!vis[temp]){//满足条件
vis[temp] = 1;
output[num++] = temp;
dfs1(temp);//继续下一个节点
vis[temp] = 0; //尝试失败回溯
num--;
}
}
}