【题解】洛谷 CF141B Hopscotch
思路
大模拟 (比猪国杀小多了)
开始正经起来
注:本题解所说的“层数”均为总层数去掉一层的,因为第一层不在循环节内。(即 \(8\) 所在的那一层我们叫做第五层,而非第六层)
先看一个本蒟蒻画的草图
这道题需要先判断很多,有很多小细节需要注意: (别问我怎么知道的,看我 CF 的提交记录就知道了)
-
判断坐标是不是在第 \(1\) 或第 \(2\) 象限,如果不在直接输出 \(-1\)。
-
判断 \(y\) 坐标是否在正方形边界上,如果不在直接输出 \(-1\)。
-
特判第一层。
把以上部分预处理完毕,再来计算 \(y\) 坐标在第几层上。
然后判断层数为奇数层或层数为偶数层的情况:
层数为偶数层
首先明确,层数为偶数层时,每一层有 \(2\) 个正方形,即需要推出两个式子。
我们可以先推出在第二象限的正方形的数字:由题意得,除第一层外,每 \(3\) 个正方形为一循环,那在第二象限的正方形的数字就很好推了,就是本轮循环的最后一个数字 \(-1\) 再 \(+1\),也就是本轮循环的最后一个数字,为:\(\frac{3n}{2}\)。
那在第一象限的正方形的数字就是 \(\frac{3n}{2} +1\) 了。
知道了这些,还要特判一下 \(x\) 坐标是否在正方形内部,如果不在直接输出 \(-1\)。
层数为奇数层
式子也很好推,即为 \(\lfloor \frac{n}{2} \rfloor \times 3 +2\)。
也要特判 \(x\) 坐标是否在正方形内部,如果不在直接输出 \(-1\)。
如果看不明白就看看代码吧。 你肯定现在已经明白了(确信)
代码
#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
int a,x,y,n;//n为层数
int main()
{
scanf("%d%d%d",&a,&x,&y);
int n=y/a;//计算除第一层外的层数(总层数-1)
if(y<=0)//不在第1或第2象限
{
printf("-1\n");
return 0;
}
if(y%a==0)//y坐标在正方形边界上
{
printf("-1\n");
return 0;
}
if(n==0)//特判第1层
{
if(y<a && abs(x)>=a/2.0)//如果不在正方形内
{
printf("-1\n");
return 0;
}
else
{
printf("1\n");
return 0;
}
}
if(n%2==0)//为偶数层
{
if(abs(x)>=a || x==0)//x坐标在正方形外
{
printf("-1\n");
return 0;
}
if(x<0)//在第2象限
{
printf("%d\n",3*n/2);
return 0;
}
else//在第1象限
{
printf("%d\n",3*n/2+1);
return 0;
}
}
else//为奇数层
{
if(abs(x)>=a/2.0)//x坐标在正方形外
{
printf("-1\n");
return 0;
}
printf("%d\n",n/2*3+2);
}
return 0;
}
这是本蒟蒻写的最长的一篇题解了,望管理大大通过啊