0
点赞
收藏
分享

微信扫一扫

蓝桥杯真题31日冲刺国一 | 每日题解报告 第十八天

一丶找素数

题目链接:找素数跳转链接

题目要求:

找第100002个素数。

解题思路:

一个签到题,暴力求解就好啦,要注意一下while循环里面的num++不要放在后面。

#include<bits/stdc++.h>
using namespace std;
bool pd(int x)
{
	for(int i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
		{
			return false;
		}
	}
	return true;
}
int main()
{
	int m = 0,num = 1;
	while(m!=100002)
	{
		num++;
		if(pd(num))
		{
			m++;
		}
	}
	cout<<num;
	return 0;
} 

二丶分考场

题目链接:分考场

这个题我也不会,5115,全排列应该能骗分,大家有思路的可以去看看,后面会补。

三丶合根植物

题目链接:进去登录点题集 真题 搜索合根植物

题目要求:

w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。
如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?

解题思路:

这是一个并查集的题目,很简单,套板子就好了,不会并查集的话我这里放一个链接,可以去看看,我觉得讲得很通透。

链接:通俗易懂并查集

#include<bits/stdc++.h>

using namespace std;
 
const int N = 1000010;
int m,n,k,pre[N],ans;
bool vis[N];
 
void init()
{
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n*m;i++)
	{
		pre[i] = i;	
	}
}
 
int find(int x)  
{
	if(x!=pre[x])
	{
		return pre[x] = find(pre[x]);
	}
	return x;
}
 
void join(int x,int y)
{
	int xx = find(x);
	int yy = find(y);
	if(xx!=yy)
	{
		pre[yy] = xx;
	}
}
 
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	init();
	for(int i=0;i<k;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		join(x,y);
	}
	for(int i=1;i<=n*m;i++)
	{
		vis[find(i)] = 1;
	}
	for(int i=1;i<=n*m;i++)
	{
		ans += vis[i];
	}
	cout<<ans<<endl;
	return 0;
}

四丶大胖子走迷宫

题目链接:进去登录点题集 真题 搜索大胖子走迷宫

题目要求:

 

解题思路:这是一个非常恶心(我认为)的bfs题,一开始我看的蒙了怎么还能变身,后面发现要多判断一下体重随着时间的变化,淦。

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

struct node{
	int x, y, r;
};

const int N = 310;

int n,k;
char g[N][N];
int dist[N][N][3];
int dr[3] = {2, 1, 0};
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

int bfs()
{
	queue<node>q;
	memset(dist,-1,sizeof(dist));
	q.push({3,3,2});
	dist[3][3][2] = 0;
	while(q.size())
	{
		node t = q.front();
		q.pop();
		
		int time = dist[t.x][t.y][t.r];
		if(t.x == n - 2 && t.y == n - 2)
		{
			return time;
		}
		
		int r = time / k > 2 ? 0 : dr[time / k];
		int R = (time + 1) / k > 2 ? 0 : dr[(time + 1) / k];
		
		if(r > 0)
		{
			q.push({t.x, t.y, R});
			dist[t.x][t.y][R] = time + 1;
		}
		for (int i = 0; i < 4; i ++)
		{
			int xx = t.x + dx[i],yy = t.y + dy[i];
			if(xx - r < 1 || xx + r > n || yy - r < 1 || yy + r > n)
			{
				continue;
			}
			if(dist[xx][yy][r] != -1)
			{
				continue;
			}
			bool flag = false;
			for (int i = xx - r; i <= xx + r; i ++)
			{
				for (int j = yy - r; j <= yy + r; j ++)
				{
					if(g[i][j] == '*')
					{
						flag = true;
						break;
					}
				}
			}
			if(flag)
			{
				continue;
			}
			q.push({xx,yy,R});
			dist[xx][yy][R] = time + 1;		
		}
	}
}
int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i ++)
	{
		cin >> g[i] + 1;
	}
	cout << bfs();
	return 0;
}

总结:

今天题目bfs变种大家要好好理解方便自己更熟练的使用bfs。

举报

相关推荐

0 条评论