1219. 移动距离

https://www.acwing.com/problem/content/1221/

根据样例,模拟一下得出规律
即n/w的值决定n所在的行数是正向还是反向
n/2为偶,则为正,为奇,则为反
对于一个数,它的位置表示可以用,行:行/w,列:列%w
细节点1:
但是,对于边界值却不好处理
例如:
1   2   3   4   5   6
12 11 10  9   8   7
显然1~5都可以用 本身值/w,本身值%w 来表示这些数的行号,列号
但是与它们同一行的6却无法这样表示,6/w=1,而它们都为0,同样的12也是如此
寻找规律,我们发现能被w整除的都是这样,且均处在边界值,与同一行的用同一方式表示出的值不同
解决这个问题只需要每个数字-1即可,-1就能让边界值,与它们的值/w相同的在一行
如:
0   1   2   3   4   5
11 10 9   8   7    6
如此,就满足规律了,但是对于原本所求的数,位置就改变了,我们所求的是两个位置的距离,因此只要改为求原位置的距离即可,即所有数字因加上了0而像右移动一位,我们所求的即向左移动一位的位置的距离即可,即求m-1,n-1两个数的位置
还有细节点2:
对于n/2的奇数行,即反向行,要求其位置,需要求正向的此行第几个数,即正向列号,带入含0的样例可以很轻松知道,其值为:w-1-n%w

如此,难点都被解决

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,m,w;
int main()
{
    scanf("%d%d%d",&w,&n,&m);
    n--,m--;
    int x1 = n/w,x2 = m/w;
    int y1 = n%w,y2  = m%w;
    if(x1 % 2) y1 = (w-1) - y1; 
    if(x2 % 2) y2 = (w-1) - y2; 
    printf("%d\n",abs(x1-x2)+abs(y1-y2));
    return 0;
}

 

posted @ 2022-10-09 20:32  风乐  阅读(42)  评论(0)    收藏  举报