题目描述
题目描述不再赘述,这里简单的说一下思路:可以创建一个列为w,行为(max1=max(n,m),行=max1/w+1,这是最大的行数)的数组,奇数行正序,偶数行逆序(注意1)。然后在该数组里面找到对应的m,n,并记录x1,y1,x2,y2即可。最后让对应坐标的横坐标相减绝对值+纵坐标相减绝对值相加即可。
例如题目中的数:
6 8 2
先求出最大的行数(不然会爆内存) 8/6+1=2最大两行
写出数组
然后遍历搜寻即可
样例
输入样例:
6 8 2
输出样例:
4
算法1
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N=10000;
int a[N][N];
int w,m,n;
int num1;
int k=1;
int b,c,d,e;
int main()
{
cin>>w>>m>>n;
int t=max(m,n);
int t1=t/w+1;
for(int i=1;i<=t1;i++)
{
if(i%2==0&&i!=1)
{
for(int j=w;j>=1;j--)
{
a[i][j]=k++;
}
}
else if(i%2!=0||i==1)
{
for(int j=1;j<=w;j++)
{
a[i][j]=k++;
}
}
}
for(int i=1;i<=t1;i++)
{
for(int j=1;j<=w;j++)
{
if(a[i][j]==m)
{
b=i;
c=j;
break;
}
}
}
for(int i=1;i<=t1;i++)
{
for(int j=1;j<=w;j++)
{
if(a[i][j]==n)
{
d=i;
e=j;
break;
}
}
}
//cout<<b<<c<<d<<e<<endl;
num1=abs(b-d)+abs(c-e);
cout<<num1<<endl;
return 0;
}