每日刷题(五十)
蓝桥杯第九届C语言B组省赛习题
习题G:螺旋折线
图p1.png
这道题确实很有难度,根据题目题目所述,这个肯定不能用暴力枚举得满分的,我们要用到long long型数据长度,因为int型无法满足这么大的数据。
如果把这个螺旋想成一个个嵌套的正方形那么题目就简单多了
从里往外看,第一层正方形边长为2,第二层边长为4,第三层边长为6,但看这一个三角形,从里到外,每往外一层边长增加1,等差就是1,我们很容易想到等差数列
但是我们需要分四种情况讨论:
第一种:y > 0 && abs(x) <= y
即求点落在正方形上边的情况
第二种:x > 0 && x > abs(y)
即求点落在正方形右边的情况
第三种:y < 0 && abs(y) >= abs(x)
即求点落在正方形下边的情况
第四种:x < 0 && abs(x) > abs(y)
即求点落在正方形左边的情况
如下图
详细C代码如下:
#include<stdio.h>
long long sum1(long long x, long long y) //上方线
{
if(y == 1)
return 2 * y + y + x;
else if(y == 2)
{
return 4 + (1 + (y - 1) * 1) * 2 + y + x;
}
else
return (4 + (1 + (y - 2) * 1) * 2 * 4) * (y - 1) / 2 + (1 + (y - 1) * 1) * 2 + y + x;
}
long long sum2(long long x, long long y) //右方线
{
if(x == 1)
return 2 * x * 2 + x - y;
else if(x == 2)
return 4 + (1 + (x - 1) * 1) * 2 * 2 + x - y;
else
return (4 + (1 + (x - 2) * 1) * 2 * 4) * (x - 1) / 2 + (1 + (x - 1) * 1) * 2 * 2 + x - y;
}
long long anti(int y, int x)
{
return abs(x) + y;
}
long long sum3(long long x, long long y)
{
if(abs(y) == 1)
return 2 * y * 3 + abs(y) - x;
else if(abs(y) == 2)
return 4 + (1 + (abs(y) - 1) * 1) * 2 * 3 + abs(y) - x;
else
return (4 + (1 + (abs(y) - 2) * 1) * 2 * 4) * (abs(y) - 1) / 2 + (1 + (abs(y) - 1) * 1) * 2 * 3 + abs(y) - x;
}
long long sum4(long long x, long long y)
{
if(abs(x) == 1)
return 1;
else if(abs(x) == 2)
return 4 + anti(y, abs(x));
else
return (4 + (1 + (abs(x) - 2) * 1) * 2 * 4) * (abs(x) - 1) / 2 + anti(y, abs(x));
}
int main()
{
long long x, y;
scanf("%lld %lld", &x, &y);
long long sum = 0;
if(y > 0 && abs(x) <= y)
{
sum = sum1(x, y);
}
else if(x > 0 && x > abs(y))
{
sum = sum2(x, y);
}
else if(y < 0 && abs(y) >= abs(x))
{
sum = sum3(x, y);
}
else if(x < 0 && abs(x) > abs(y))
{
sum = sum4(x, y);
}
printf("%d\n", sum);
return 0;
}
部分运行结果如下: