---恢复内容开始---
首先,我们来看一下题目:
时间限制 : 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;
}
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;
}
题目做完啦!!!!
---恢复内容结束---