背景描述
有一个居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...,当排满一行时,从下一行相邻的楼往反方向排号。
例如:小区为 3 行 6 列,矩阵排列方式:
要求:已知小区楼房有 w 列及小T和小D家楼号 t 和 d,小T要去小D家串门最少要经过几个楼(不能斜线方向移动)。
例如上图:当 w=6,t=8,d=2,从 8 号楼到 2 号楼最短的路线经过 5,4,3,2 四个楼(9,10,11,2 也经过四个楼),故最短路线为 4(注:不考虑路线只考虑最短路线经过几个楼)。
题面描述
输入三个正整数 w(1<w<21),t(1<m<10001),d(1<n<10001),且 t 不等于 d。三个正整数之间以一个空格隔开,输出 t 到 d 的最短路线经过几个 楼。
输入格式
在一行输入三个正整数 w,t,d,三个正整数之间以一个空格隔开。
输出格式
输出 t 到 d 的最短路线经过几个楼。
输入样例#1
6 8 2
输出样例#1
4
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,f,g,x,y,w,t,d;
cin>>w>>t>>d;
if(t%w!=0){
f=t/w+1;
}else{
f=t/w;
}
if(d%w!=0){
g=d/w+1;
}else{
g=d/w;
}
if(f%2==1){
if(t%w==0){
n=w;
}else{
n=t%w;
}
}else{
n=f*w-t+1;
}
if(g%2==1){
if(d%w==0){
m=w;
}else{
m=d%w;
}
}else{
m=g*w-d+1;
}
if(f>g){
x=f-g;
}else{
x=g-f;
}
if(n>m){
y=n-m;
}else{
y=m-n;
}
cout<<x+y;
return 0;
}