题目描述
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 …..
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动
输入
输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
输出
输出一个整数,表示m n 两楼间最短移动距离。
样例输入
6 8 2
样例输出
4
题解:
主要找a,b两坐标点的坐标,然后将a,b的横纵坐标只差相加。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int max(int a,int b){//返回a,b的最大值
return a?b:a>b;
}
int main(){
int n,x1,y1,x2,y2,a,b,c,d,t1,r1,t2,r2;//t1,r1表示a点坐标,t2,r2表示b点坐标
scanf("%d%d%d",&n,&a,&b);
c=max((a/n),(b/n));
int m[c][n];
//求a点坐标
x1=a/n;y1=a%n;
if(y1==0){
if(x1&1==1){t1=x1-1;r1=n-1;}
else{t1=x1-1;r1=0;}
}
else {
if(x1&1==1){
t1=x1;r1=n-y1;
}
else{
t1=x1;r1=y1-1;
}
}
//求b点坐标
x2=b/n;y2=b%n;
if(y2==0){
if(x2&1==1){t2=x2-1;r2=n-1;}
else{t2=x2-1;r2=0;}
}
else {
if(x2&1==1){
t2=x2;r2=n-y2;
}
else{
t2=x2;r2=y2-1;
}
}
//横纵坐标差值之和
d=abs(t2-t1)+abs(r2-r1);
printf("%d",d);
}