AcWing 1219 .移动距离 (模拟)

题目

思路:
利用 横差 和 竖差 之和,找出答案。
注意:
中间输出调试 ;
分阶段测试 看到底哪一阶段的错误 ;
注意0值(特殊值)的处理 。

在这里插入图片描述

代码:

#include <cstring>//中间输出调试 ,分阶段测试 看到底哪一阶段的错误 ,注意0值(特殊值)的处理 
#include <iostream>
#include <algorithm>
#include<cmath>
using namespace std;

int w,mm,nn;

int main()
{
  cin>>w>>mm>>nn;
  int ww=2*w;
  int m=max(mm,nn);//因为题中并没有给出谁是最大,所以需要自己判断出来 
  int n=min(mm,nn);
  int nm=n/ww;
  int mn=m/ww;
  int ym=m%ww,yn=n%ww;
  
  if(!ym) mn--;
  if(!yn) nm--;//0值处理 例如样例 8 92 16  ,虽然16/16=1,但是它属于竖着第 0 队列(9是第一队列),所以nm --  
  int sums=(mn-nm)*2;//sums 代表竖着差多少层 
  if(m%ww>w||m%ww==0) sums++;//判断它是队列的哪一层 ,m 在第二层了话sums++ ,n 在第二层了话sums--  
  if(n%ww>w||n%ww==0) sums--;
  
  int yym;
  int yyn;
  
  if(ym>w) 
  {
  	yym=ym%w;//yym 是用于第二层的除余 
  	 yym=w+1-yym;//将第二层的余数与第一层对应,用于横差运算 
  }
  else if(!ym) yym=1;//除余为0,变成1,具体看图 
  else yym=ym;//余数小于 w ,直接就是yym 
  
  if(yn>w) 
  {
  	yyn=yn%w;
  	 yyn=w+1-yyn;
  }
  else if(!yn) yyn=1;
  else yyn=yn;
  
  int sum=abs(yyn-yym)+sums;
  cout<<sum;
  
  return 0;
}

y总的方法:
在这里插入图片描述
y总代码:

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int w, m, n;
    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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值