小X与机器人

---恢复内容开始---

首先,我们来看一下题目:

时间限制 : 1 Sec
内存限制 : 128 Mb
提交 : 141
解决 : 64

题目描述

小X的老师很喜欢围棋。众所周知,围棋的棋盘有19行19列,共有361个交叉点。为方便起见,我们把这些行列按顺序编号为1~19,并用(x, y)表示第x列第y行的位置。例如下图中,A用(16,4)表示,B用(14, 3)表示。

小X在做一个机器人的项目,他正思考这样一个问题:如果一个小机器人从(x1, y1)这个位置出发,沿直线移动到(x2, y2)这个位置,它一共经过了多少个交叉点?

注意起点和终点也算作经过,因此至少经过了2个交叉点。

 

输入

输入数据仅有一行包含4个用空格隔开的正整数,分别表示x1, y1, x2, y2

 

输出

输出一行包含一个小于20的正整数,表示从(x1, y1)沿直线移动到(x2, y2)经过的交叉点的个数。

 

样例输入

样例1: 
4 4 4 16
样例2: 
1 1 19 19
样例3: 
1 1 7 5

样例输出

样例1: 
13
样例2: 
19
样例3: 
3
 
偶们的思路:
1、将所有两点移至左下角,消除一个坐标。
2、剩下的坐标行(以下称H)列(以下称L)if (H==0)输出L+1;if (L==0) 输出H+1。
3、接下来的,通过观察,点数为剩下的HL坐标的最大公约数+1。
4、可以做了。
 
标程:
#include<bits/stdc++.h>
using namespace std;
int x1,yy1,x2,y2,s,ans=1,i=2;
int main()
{
 cin>>x1>>yy1>>x2>>y2;
    if (x1>x2)x1=x1-x2;
    else x1=x2-x1;
    if (yy1>y2)yy1=yy1-y2;
    else yy1=y2-yy1;
    if (x1==0)cout<<yy1+1<<endl;
    else if (yy1==0)cout<<x1+1<<endl;
         else
        {
         
         while(i<=x1)
         {
          if(x1%i==0)
          {
           if (yy1%i==0)
     {
      ans*=i;
      yy1=yy1/i;
     }
           x1=x1/i;
          }
          else
           ++i;
         }
         cout<<ans+1<<endl;
        }
 return 0;
}
 
题目做完啦!!!!

---恢复内容结束---

原文地址:https://www.cnblogs.com/leonqqs/p/7065064.html