蓝桥杯七段码简约版(递推dfs,状态编码)

题目

在这里插入图片描述

解析

将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;


}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值