《计算思维综合训练》第四次作业题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

请大家理解思路,自己尝试写出代码,不要抄袭!
请大家理解思路,自己尝试写出代码,不要抄袭!
请大家理解思路,自己尝试写出代码,不要抄袭!

猜你喜欢

转载自blog.csdn.net/jerry99s/article/details/84398591