Seven-segment code-DFS, use set to de-duplicate and save the path

Insert picture description here

#include<bits/stdc++.h>
using namespace std;

//1-a  2-b 3-c 4-d 5-e 6-f  7-g
int e[10][10],vis[10];//e[i][j]=1表示边i和边j连通(并不是顶点)
int res;
set<set<int>>se;//用于去重路径

void add(int x,int y)
{
    
    
    e[x][y]=1;
    e[y][x]=1;
}

void dfs(int x,set<int> s)
{
    
    
    if(!se.count(s))se.insert(s),res++; //如果该种结果没有被统计过
    if(s.size()==7)return;//当边数达到7时,没有必要继续统计下去
    for(int i=1;i<=7;i++){
    
    //搜索其它边
        if(!e[x][i]||vis[i])continue;
        s.insert(i);
        vis[i]=1;
        dfs(i,s);
        vis[i]=0;//recall
        s.erase(i);
    }
}

int main()
{
    
    
    add(1,2);add(1,6);//a
    add(2,7);add(2,3);//b
    add(3,7);add(3,4);//c
    add(4,5); //d
    add(5,6);add(5,7);//e
    add(6,7);//f
    set<int>s;
    for(int i=1;i<=7;i++){
    
    
        s.insert(i);
		vis[i]=1;
		dfs(i,s);
		vis[i]=0;
		s.erase(i);
    }
    return cout<<res<<endl,0;
}

Guess you like

Origin blog.csdn.net/weixin_43615816/article/details/114989743