题目
解析
将a,b,c,d,e,f,g用1-7编码,作出它们的邻接矩阵
对a,b,c,d,e,f,g进行dfs(对a的dfs所得的状态一定包含a,如a,ab,af,abc…,同理对b的dfs得到的状态一定包含b,如b,ba,…,以此类推),明显对a的dfs得到的ab和对b的dfs得到的ba两个状态是重合的,所以要设定一个针对状态的vis数组,如果该状态被访问过,就不重复计数。
要使用 状态的vis数组 就要提前对状态编码
编码原则:0灭1亮 ,状态对应的二进制编码范围0000000~01111111,最多有2^7个状态
AC代码:
#include<bits/stdc++.h>
using namespace std;
// a b c d e f g
// 1 2 3 4 5 6 7
bool vis[10]={false};//1~7
int G[10][10];//邻接矩阵
int re=0;//总状态数
const int max_state=1<<7;// 0灭1亮 :二进制编码0000000~01111111 最多有2^7个状态
bool vis_state[max_state]={false};
int convert()//通过vis数组的true,false转为状态编号
{
int num=0;
for(int i=1;i<=7;i++)
{
if(vis[i]==true) num+=1<<(i-1);
}
return num;
}
void dfs(int i)
{
vis[i]=true;
if(vis_state[convert()]==false)
{
re++;
vis_state[convert()]=true;
}
for(int j=1;j<=7;j++)
{
if(G[i][j]==1 && vis[j]==false)
{
dfs(j);
}
}
vis[i]=false;
}
void init()
{
G[1][2]=1;
G[1][6]=1;
G[2][1]=1;
G[2][7]=1;
G[2][3]=1;
G[3][7]=1;
G[3][2]=1;
G[3][4]=1;
G[4][3]=1;
G[4][5]=1;
G[5][4]=1;
G[5][7]=1;
G[5][6]=1;
G[6][1]=1;
G[6][7]=1;
G[6][5]=1;
G[7][2]=G[7][3]=G[7][5]=G[7][6]=1;
}
int main()
{
init();
for(int i=1;i<=7;i++)
{
dfs(i);
}
cout<<re;
}