回溯算法

回溯算法是深度优先搜索的一种
回溯算法不要求保存完整的搜索树“
回溯算法是一种尝试所有可能直到找到一条正确路径的算法
代码的实现样例

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--;
        }
    }
}
点赞