第四次练习部分题解

gyr的正方形

题意

找到(0,0)和(n,m)组成的矩形中有多少四个点能组成一个正方形。

做法

枚举每一种边与坐标轴平行的正方形,一共有min(n,m)min(n,m)种,

对于每个边长为i的坐标轴平行的正方形,在(n,m)(n,m)中一共有(ni+1)(mi+1)(n-i+1)*(m-i+1)个,

且其内部"包含"ii个正方形,如下图所示。

alt

时间复杂度O(min(n,m))

#关键代码

for(i = 1; i <= min(n , m); i++)
{
    ans += i * (n - i + 1) * (m - i + 1);
}
printf("%lld\n", ans);

gyr的图图

题意

打出一个#和*互相嵌套的图。

做法

通过观察不难发现,每一层的每个图案的位置的min(i,j,ni+1,nj+1)min(i,j,n-i+1,n-j+1)都相等,且不同层奇偶不同。

时间复杂度O(n*n)

关键代码

for(i = 1; i <= n; i++)
{
    for(j = 1; j <= n; j++)
    {
        int w = n;
        if(w > i) w = i;
        if(w > j) w = j;
        if(w > n - i + 1) w = n - i + 1;
        if(w > n - j + 1) w = n - j + 1;
        if(w % 2 == 1) printf("# ");
        else printf("* ");
    }
    printf("\n");
}

gyr的地砖1

题意

用01构造一种每个数的4个方向有两个数与这个数不同的n*m的矩阵。

做法

本题提供一种构造方法

对于每个4*4的01,如图示构造(01相反也可)。

alt

时间复杂度O(n*m)

关键代码

for(i = 1; i <= n; i++)
{
    if(i % 4 == 1|| i % 4 == 0)
    {
        for(j = 1; j <= m; j++)
        {
            if(j % 4 == 1|| j % 4 == 0) printf("1 ");
            else printf("0 ");
        }
    }
    else
    {
        for(j = 1; j <= m; j++)
        {
            if(j % 4 == 1|| j % 4 == 0) printf("0 ");
            else printf("1 ");
        }
    }
    printf("\n");
}

gyr炸地砖

题意

用X.构造一个nn矩阵,使得这个矩阵里每1k和k*1的子矩阵只有一个X,且(x,y)必须为X

做法

本题提供一种做法。

通过观察不难发现如下图的简单方法(红色线代表X)。

alt

接下来问题在于如何找到哪一条斜线是X。

alt

alt

alt

可以发现,每一条斜线的 iji-j 都是独一无二的

alt

同时不同斜线之间的横纵向距离差也为i-j的差。

那么只需要在(ij(i-j)(xy)(x-y)同余(膜k相等)时,那么这个点就是X。

同理,i+ji+j的构造方式也一样,可以自己尝试。

时间复杂度O(n*n)

关键代码

for(i = 1; i <= n; i ++)
{
    for(j = 1; j <= n; j ++)
    {
        if(abs(i - j - (r - c)) % k == 0) printf("X");
        else printf(".");
    }
    printf("\n");
}
全部评论

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
害怕一个人的小黄鸭胖乎乎:笑死了,没有技术大牛,招一堆应届生,不到半年,代码就成屎山了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务