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;
}
标签:y2,移动,int,边界值,1219,距离,位置,y1,include From: https://www.cnblogs.com/lxl-233/p/16773597.html