一丶找素数
题目链接:找素数跳转链接
题目要求:
找第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。