问题描述
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 …
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
Input
3个整数w m n,空格分开,都在1到10000范围内
Output
要求输出一个整数,表示m n 两楼间最短移动距离。
Sample Input
6 8 2
4 7 20
Sample Output
4
5
完整代码如下
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef long long ll;
int main()
{
ll w,m,n,disc,disr;
ll frow,fcol,srow,scol;
ll minus_row,minus_col;
ll row;
while(~scanf("%lld%lld%lld",&w,&m,&n))// 4 7 20
{
frow = m % w == 0? m/w:m/(w-1);
srow = n % w == 0? n/w:n/(w-1);
if(frow%2!=0){
fcol = (m%w-1+w)%w;
}else{
fcol = (w-m%w)%w;
}
if(srow%2!=0){
scol =(n%w-1+w)%w;
}else{
scol =(w-n%w)%w;
}
if(fcol-scol<0)
{
minus_col = scol-fcol;
}else{
minus_col = fcol-scol;
}
if(frow-srow < 0)
{
minus_row = srow-frow;
}else{
minus_row = frow-srow;
}
printf("%lld\n",minus_col+minus_row);
}
return 0;
}
解题思路
算第一个数的行号和列号,行号比较容易解决:n % w == 0? n/w : n/(w-1),
列号的确定依赖于行是奇数还是偶数
偶数行:从左至右升序 列号 = (宽度-数字%宽度)%宽度
奇数行:从左至右降序 列号 = (数字%宽度-1+宽度)%宽度
同上,算第二个数的行号和列号,
两个数的|行号之差|+|列号之差|就是答案。