第四次练习部分题解
gyr的正方形
题意
找到(0,0)和(n,m)组成的矩形中有多少四个点能组成一个正方形。
做法
枚举每一种边与坐标轴平行的正方形,一共有种,
对于每个边长为i的坐标轴平行的正方形,在中一共有个,
且其内部"包含"个正方形,如下图所示。
时间复杂度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的图图
题意
打出一个#和*互相嵌套的图。
做法
通过观察不难发现,每一层的每个图案的位置的都相等,且不同层奇偶不同。
时间复杂度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相反也可)。
时间复杂度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)。
接下来问题在于如何找到哪一条斜线是X。
可以发现,每一条斜线的 都是独一无二的
同时不同斜线之间的横纵向距离差也为i-j的差。
那么只需要在与同余(膜k相等)时,那么这个点就是X。
同理,的构造方式也一样,可以自己尝试。
时间复杂度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");
}