蓝桥杯真题——网络寻址、翻硬币(dfs、贪心)

目录

1.P8605 [蓝桥杯 2013 国 AC] 网络寻路

2.P8597 [蓝桥杯 2013 省 B] 翻硬币


1.P8605 [蓝桥杯 2013 国 AC] 网络寻路

思路:

加边函数可结合链表理解,如图右

考点:dfs深度搜索

代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=2e5+10;
 
int h[N],e[N],ne[N],idx;
void add(int a,int b) //加边函数 ,可利用链表理解
 //idx表示一个空点,e[idx]代表其编号
 //ne[idx]代表指针,h[a]表示 
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
int ans=0;

void dfs(int x,int fa,int cnt)
{
	if(cnt==4)//有4个节点结束 
	{
		ans++;
		return;
	}
	//h[x]表示开始的头节点 
	//i!=-1也可写成~i 
	for(int i=h[x];i!=-1;i=ne[i])
	{
		int j=e[i];
		if(j==fa)continue;
		dfs(j,x,cnt+1);
	}
	return ;
 } 
int main()
{
	int n,m;
	cin>>n>>m;
	memset(h,-1,sizeof h);//h为头结点,置为-1,代表每个点都指向-1,实现截止标志 
	
	//存边
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		add(x,y);add(y,x);//实现双向边 
	 } 
	 
	 //从每个点出发,枚举所有开始的点 
	 for(int i=1;i<=n;i++)
	 {
	 	//分别代表第i个点开始,它的父节点是什么,当前这条路径有多少个点
		 //父节点是为了防止往回走 
	 	dfs(i,-1,1);//从第i个点出发,由于每个点从-1开始,则-1为其father,cnt表示当前的节点数量 
	 }
	 cout<<ans<<endl;
}

2.P8597 [蓝桥杯 2013 省 B] 翻硬币

考点:

贪心(不是动态规划,因为没有后效性,即前面的决策不会影响后面的决策)

代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
	string s1,s2;
	cin>>s1>>s2;
	int ans=0;
	for(int i=0;i<s1.size()-1;i++)
	{
		if(s1[i]!=s2[i])
		{
			if(s1[i+1]=='*')
				s1[i+1]='o';
			else s1[i+1]='*';
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值