2020蓝桥杯国赛c++B组(填空题)

A.美丽的2

在这里插入图片描述

//美丽的2
//答案:563 
#include<bits/stdc++.h>
using namespace std;
int check(int x)
{
	while(x)
	{
		if(x%10==2) return true;
		x/=10;
	}
	return false;
}
int main()
{
	int res=0;
	for(int i=1;i<=2020;i++)
	{
		if(check(i)) res++;
	}
	cout<<res;
	return 0;
}

B.扩散

在这里插入图片描述

//扩散 
//BFS
//答案:20312088 
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=6300;
int g[N][N];
int dist[N][N];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int bfs()
{
	memset(dist,-1,sizeof dist);
	queue<PII>q;
	q.push({0+2100,0+2100});
	q.push({2020+2100,11+2100});
	q.push({11+2100,14+2100});
	q.push({2000+2100,2000+2100});
	dist[2100][2100]=0;
	dist[4120][2111]=0;
	dist[2111][2114]=0;
	dist[4100][4100]=0;
	int cnt=0;
	while(q.size())
	{
		auto t=q.front();
		q.pop();
		if(dist[t.first][t.second]==2021) break;
		cnt++;
		for(int i=0;i<4;i++)
		{
			int nx=dx[i]+t.first,ny=dy[i]+t.second;
			if(dist[nx][ny]==-1)
			{
				q.push({nx,ny});
				dist[nx][ny]=dist[t.first][t.second]+1;
			}
		}
	}
	return cnt;
}
int main()
{
	cout<<bfs();
	return 0;
}

C.阶乘约数

在这里插入图片描述

//阶乘约数
//N的约数个数=(cnt1+1)*(cnt2+1)*(cnt3+1)*.....*(cntk+1)
//cnt为N的所有质因数对应的出现次数
//因为,N=p1^cnt1+p2^cnt2+.......+pk^cntk 
//答案:39001250856960000
#include<bits/stdc++.h>
using namespace std;
const int N=110;
unordered_map<int,int>a;
int main()
{
	int cnt=0;
	//先求出所有的质因数以及对应的个数 
	for(int i=1;i<=100;i++)
	{
		int x=i;
		for(int j=2;j<=x/j;j++)
		{
			while(x%j==0)
			{
				a[j]++;
				x/=j;
			}
		}
		if(x>1) a[x]++;
	}
	long long res=1;
	for(auto t:a)
	{
		int val=t.first,cnt=t.second;
		res=res*(cnt+1);
	}
	cout<<res;
	
	return 0;
}

D.本质上升序列

在这里插入图片描述

//本质上升序列 
//BFS
//答案: 3616159 
#include<bits/stdc++.h>
using namespace std;
typedef pair<string,int>PSI;
string str="tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl";
queue<PSI>q;//用队列维护字串及字串最后一个位置 
unordered_map<string,int>st;//标记是否出现 
int ans;//记录个数 
int main()
{
	//先把长度为1的字符串加入队列 
	for(int i=0;i<200;i++)
	{
		string s="";
		s+=str[i];
		if(!st[s])
		{
			st[s]=1;//标记 
			q.push({s,i});//加入队列 
			ans++;//合法序列+1 
		}
	}
	//再通过bfs,把长度大于1的字符串加入队列,进行筛选判断 
	while(q.size())
	{
		auto t=q.front();
		q.pop();
		string s=t.first;
		int pos=t.second;
		for(int i=pos+1;i<200;i++)
		{
			if(str[i]>str[pos]&&!st[s+str[i]])
			{
				st[s+str[i]]=1;//标记 
				q.push({s+str[i],i});//加入队列 
				ans++;//合法序列+1 
			}
		}
	}
	cout<<ans;
	return 0;
}

E.玩具蛇

在这里插入图片描述

//玩具蛇 
//DFS
//答案: 552 
#include<bits/stdc++.h>
using namespace std;
int ans;
int n=4;
int st[10][10];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void dfs(int x,int y,int u)
{
	if(u==n*n)
	{
		ans++;
		return ;
	}
	for(int i=0;i<4;i++)
	{
		int nx=dx[i]+x,ny=dy[i]+y;
		if(!st[nx][ny]&&nx>=1&&nx<=n&&ny>=1&&ny<=n)
		{
			st[nx][ny]=1;
			dfs(nx,ny,u+1);
			st[nx][ny]=0;
		}
	}
} 
int main()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			st[i][j]=1;
			dfs(i,j,1);
			st[i][j]=0;
		}
	}
	cout<<ans;
	return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jm呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值