版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jerry99s/article/details/84398591
请大家理解思路,自己尝试写出代码,不要抄袭!
请大家理解思路,自己尝试写出代码,不要抄袭!
请大家理解思路,自己尝试写出代码,不要抄袭!
Problem C. 课堂作业-9-2
分析: dfs即可;每搜到一个块,把所有矿打标记,并把答案ans+1。
代码:
//jerry99
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int tmax=1005;
int n,dx[9]={0,-1,-1,-1,0,0,1,1,1},
dy[9]={0,-1,0,1,-1,1,-1,0,1};
char s[tmax][tmax];
bool v[tmax][tmax];
void dfs(int x,int y)
{
int i,tx,ty;
v[x][y]=true;
for(i=1;i<=8;i++)
{
tx=x+dx[i];
ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&!v[tx][ty]&&s[tx][ty]=='#')
dfs(tx,ty);
}
return;
}
int main()
{
scanf("%d",&n);
int i,j;
getchar();
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%c",&s[i][j]);
getchar();
}
int ans=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(s[i][j]=='*'||v[i][j]==true) continue;
ans++;
dfs(i,j);
}
cout<<ans;
return 0;
}
Problem D. 课堂作业-8-4
分析:
暴力搜索即可;
也可用“并查集”,将相互能到达的点放在一个集合里,最后只需判断s和t是否在一个集合内。这里提供使用“并查集”的代码。
代码:
//jerry99
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int tmax=1e5+5;
int n,m,f[tmax];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main()
{
scanf("%d%d",&n,&m);
int i,a,b;
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
f[find(a)]=find(b);
}
scanf("%d%d",&a,&b);
if(find(a)==find(b)) printf("Yes");
else printf("No");
return 0;
}
Problem E. 约瑟夫环plus
分析: 第一个人报一次算作一轮,能推出来一轮之后删掉了几个人和下一轮第一个人应该报几。进行了几轮,第一个人就报了几次数。由于n很大,k很小,一轮会删掉很多人,因此轮数不会太大,时间复杂度可以接受。
代码:
//jerry99
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
int k,x,tx;
int main()
{
scanf("%lld%d",&n,&k);
ll ans;
x=1;
for(ans=1;;ans++)
{
if(x==k) break;
if(1ll*(k-x+1)>n)
x+=(int)n;
else
{
tx=x;
x=(n-(k-x+1)+1)%k;
if(x==0) x=k;
n=n-1-(n-(k-tx+1))/k;
}
}
cout<<ans;
return 0;
}
请大家理解思路,自己尝试写出代码,不要抄袭!
请大家理解思路,自己尝试写出代码,不要抄袭!
请大家理解思路,自己尝试写出代码,不要抄袭!