#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int w, m, n, i, j, k, p, t;
scanf("%d%d%d", &w, &m, &n);
if (m % w == 0)
{
i = m / w - 1; //是w的倍数时层数要减一。
}
else
{
i = m / w;
}
if (n % w == 0)
{
j = n / w - 1;
}
else
{
j = n / w;
} //分别求出m,n所在的层数。
if (j > i)
{
t = j - i;//往下走所需要的层数
k = t / 2;//表示每两层合为一层(奇数层加偶数层)
if (t % 2 == 0)
{
p = n - (m + (w * 2) * k); //m+(w*2)*k则是求出m垂直于n层的数字。偶数层所需要的。
}
else if (n > ((m + (w * 2) * k) + 2 * ((i + 1) * w - m + 1) - 1))
// 2 * ((i + 1) * w - m + 1) - 1表示2n-1,因为上下两层的数字之间存在等差数列的关系
{
p = n - ((m + (w * 2) * k) + 2 * ((i + 1) * w - m + 1) - 1);//奇数层所需要的。
}
else
{
p = -(n - ((m + (w * 2) * k) + 2 * ((i + 1) * w - m + 1) - 1));
}
}
else//这里是相当于更换m和n的位置当m更大时。又执行了一遍。
{
t = i- j;
k = t / 2;
if (t % 2 == 0)
{
p = m - (n + (w * 2) * k);
}
else if (m > ((n + (w * 2) * k) + 2 * ((j+ 1) * w - n + 1) - 1))
{
p = m - ((n + (w * 2) * k) + 2 * ((j + 1) * w - n + 1) - 1); //奇数层所需要的。
}
else
{
p = -(m - ((n + (w * 2) * k) + 2 * ((j + 1) * w - n + 1) - 1));
}
}
printf("%d\n", p + t);//本质上就是先让m移下来(求相差几层),再考虑n离m移下来的距离
printf("此程序由23本计算机2班18号辛凯编写");
return 0;
}
菜鸟一个,欢迎斧正。