第 1 题:灌溉
思路:bfs
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,m,t,k,ans;
bool f[N][N];
int dx[]= {-1,0,1,0};
int dy[]= {0,1,0,-1};
struct point {
int x,y;
};
queue<point>q;//存放可扩展结点
void bfs(int k) {
while(k--) {
int len=q.size();
while(len--) {
point tem=q.front();
q.pop();
for(int i=0; i<4; i++) {
int xx=tem.x+dx[i],yy=tem.y+dy[i];
if(!f[xx][yy]&&xx>=1&&yy>=1&&xx<=n&&yy<=m) {
ans++;
f[xx][yy]=true;
q.push({xx,yy});
}
}
}
}
cout<<ans<<endl;
}
int main() {
cin>>n>>m>>t;
while(t--) {
int x,y;
cin>>x>>y;
f[x][y]=true;
q.push({x,y});
ans++;
}
cin>>k;
bfs(k);
}
第 2 题:小朋友崇拜圈
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N];
bool vis[N]; //重点!将已经访问过的点记录下来,不再进行访问
map<int,bool>mp;
int n;
int round(int begin)
{
int ans=0,t,tt=begin;
mp.clear();
mp[tt]=true;
while(true)
{
t=f[tt];
if(!mp[t])ans++;
else if(t!=begin)return -1;
else return ans+1;
tt=f[tt];
mp[t]=true;
vis[t]=true;
}
return -1;
}
int main()
{
cin>>n;
int max1=0,t;
for(int i=1;i<=n;i++)cin>>f[i];
for(int i=1;i<=n;i++)
{
if(vis[i])continue;
t=round(i);
max1=max(max1,t);
}
cout<<max1<<endl;
}