---恢復內容開始---
首先,我們來看一下題目:
時間限制 : 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;
}
題目做完啦!!!!
---恢復內容結束---