maninbule / LanQiaoCup

蓝桥杯刷题活动
0 stars 0 forks source link

1219. 移动距离 #31

Open maninbule opened 4 years ago

maninbule commented 4 years ago

1219. 移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。

其楼房的编号为 1,2,3… 当排满一行时,从下一行相邻的楼往反方向排号。

比如:当小区排号宽度为 6 时,开始情形如下:

1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 ..... 我们的问题是:已知了两个楼号 m 和 n,需要求出它们之间的最短移动距离(不能斜线方向移动)。

输入格式

输入共一行,包含三个整数 w,m,n,w 为排号宽度,m,n 为待计算的楼号。

输出格式

输出一个整数,表示 m,n 两楼间最短移动距离。

数据范围

1≤w,m,n≤10000

输入样例:

6 8 2

输出样例:

4
maninbule commented 4 years ago

害~基础不扎实,写这个都废了不少时间

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int w,m,n;
int a1,b1,a2,b2;
int main(){
    cin>>w>>m>>n;
    m--,n--;
    a1 = m/w;
    b1 = m%w;
    a2 = n/w;
    b2 = n%w;
    if((a1&1)^(a2&1))
        b1 = w-b1-1;
    cout<<abs(a1-a2)+abs(b1-b2);

    return 0;
}
patern2000 commented 4 years ago

include

include

using namespace std;

int main() { int w,m,n; cin>>w>>m>>n; int r1,l1,r2,l2; // w+=1; m-=1; n-=1; r1=m/w; r2=n/w; l1=m%w; l2=n%w; if(r1%2==1){ l1=w-l1-1; } if(r2%2==1){ l2=w-l2-1; } int ans =abs(r1-r2)+abs(l1-l2); cout<<ans<<endl; return 0; }

consult98 commented 4 years ago
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e5+7;

int main()
{
    int w,n,m;
    cin>>w>>n>>m;
    if(n<m) swap(n,m);  
    int x1 = ceil((double)m/w);
    int y1 = m%w;
    int x2 = ceil((double)n/w);
    int y2 = n%w;
    if(x1%2==0) {
        if(y1==0) y1 = 1;
        else y1 = w-y1+1; 
    }else if(y1==0) y1 = w;

    if(x2%2==0) {
        if(y2==0) y2 = 1;
        else y2 = w-y2+1; 
    }else if(y2==0) y2 = w;

    cout<<x2-x1+abs(y2-y1)<<endl;
    return 0;
}
maobohui commented 4 years ago
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1e4+10;
int w,m,n;
int a,b,c,d;
int main(){
    cin>>w>>m>>n;
    a=ceil(m*1.0/w);
    c=ceil(n*1.0/w);
    if(a&1){
        b=m-(a-1)*w;
    }
    else{
        b=w-(m-(a-1)*w)+1;
    }
    if(c&1){
        d=n-(c-1)*w;
    }
    else{
        d=w-(n-(c-1)*w)+1;
    }
    int ans=abs(a-c)+abs(b-d);
    cout<<ans<<endl;
    return 0;
}
xunzhang123 commented 4 years ago

include

include

using namespace std; int w,m,n; int main() { scanf("%d%d%d",&w,&m,&n); int x1=m/w,x2=n/w; int y1,y2; if(x1&1) y1=m%w; else y1=w-(m%w)+1; if(x2&1) y2=n%w; else y2=w-(n%w)+1; if(y1==0) y1=w; if(y2==0) y2=w; int ans=abs(x2-x1)+abs(y2-y1); printf("%d",ans); }

LJM-Jeson commented 4 years ago
#include <bits/stdc++.h>

using namespace std;

int main(){
    int w, m, n;
    cin >> w >> m >> n;
    m --, n --;//序号减1,便于利用公式求行号和列号

    int x1 = m / w, x2 = n / w;//行号
    int y1 = m % w, y2 = n % w;//第偶数行列号
    if(x1 & 1) y1 = w - 1 - y1;//第奇数行列号
    if(x2 & 1) y2 = w - 1 - y2;

    //哈弗曼顿距离
    cout << abs(x1 - x2) +abs(y1 - y2) << endl;
    return 0;
}
hputx commented 4 years ago

include<bits/stdc++.h>

using namespace std; int m,w,n; int main() { cin>>w>>m>>n; m--,n--; int x1=m/w,x2=n/w; int y1=m%w,y2=n%w; if(x1%2)y1=w-1-y1; if(x2%2)y2=w-1-y2; cout<<abs(x1-x2)+abs(y1-y2)<< endl; return 0; }