該題有題解ios
時間限制:1000MS 內存限制:65535K
提交次數:265 經過次數:14編程
題型: 編程題 語言: G++;GCCspa
一隻螞蟻從衣服地圖上爬過留下痕跡,deathgod看到後在地圖上建了個座標,將螞蟻留下的痕跡分紅多條線段首位相連而成, 且那些線段的端點都是整數點,如今他想知道這隻螞蟻通過了座標中多少個整數點。
第一行輸入一個整數t,表示case數;對於每一個case,第一行輸入一個整數n(0<=n<=10),表明螞蟻通過的線段的數量, 接下來n+1行,每行有兩個整數x,y(-10000<=x,y<=10000),表示螞蟻依次通過線段的端點。
每一個case輸出一行,螞蟻所通過的整數點數量。
1 3 0 0 0 4 2 2 2 0
9
計算兩個點以前有多少個整數點,只要算gcd(abs(x1-x2),abs(y1-y2))就好了。
而後利用這個算出這兩個點之間整數點的座標。
而後丟進set裏面,去重。
最後輸出set的個數。code
具體看代碼blog
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <set> using namespace std; int gcd(int a ,int b) { return b>0?gcd(b,a%b):a; } int main() { int T; scanf("%d",&T); while (T--) { set <pair<int,int> > S; int n; scanf("%d",&n); int a,b,c,d; if (n) { scanf("%d%d",&a,&b); S.insert(make_pair(a,b)); } for (int i=0;i<n;i++) { scanf("%d%d",&c,&d); int GCD=gcd(abs(c-a),abs(d-b)); int len1=0,len2=0; if (GCD) len1=(c-a)/GCD,len2=(d-b)/GCD; for (int j=1;j<=GCD;j++) { S.insert(make_pair(a+j*len1,b+j*len2)); //cout<<"通過的點 :"<<a+j*len1<<" "<<b+j*len2<<endl; } a=c,b=d; } printf("%d\n",S.size()); } return 0; }