日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nyoj878格点

發布時間:2025/3/16 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj878格点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

格點

時間限制:1000?ms ?|? 內存限制:65535?KB 難度:3 描述

所謂的格點——就是平面坐標系中,縱橫坐標均為整數的點。

現在問題來了,給你平面上不同的兩個格點P1 = (x1,y1)和 P2 = (x2,y2),依次輸出在線段P1P2上所有格點的坐標。?

輸入
第一行有一個整數n,表示n組測試數據
接下來的n行,每一行有四個整數,分別表示x1,y1,x2,y2;
-10^6 < x1,x2,y1,y2 < 10^6;
輸出
每組測試數據依次輸出線段上每個格點的坐標,占單獨一行,具體格式見輸出樣例。
樣例輸入
2 0 0 3 3 1 11 5 3
樣例輸出
(0,0),(1,1),(2,2),(3,3) (1,11),(2,9),(3,7),(4,5),(5,3)

注意的地方:點的輸出順序,比如輸入1 8 -1 2,應該輸出(1,8),(0,5),(-1,2)

而不是(-1,2),(0,5),(1,8)

思路一,代碼多,思路簡單,time 88ms

思路二,代碼少,思路比思路一難一點,time 48ms

思路一:

求出線段所在直線方程,將兩點間的整數坐標代入檢驗,沒有斜率和注意斜率為0時。

測試數據來一發

4

-9 -3 4 -10

0 0 0 0

-1 2 3 2

1 2 1 5

答案

(-9,-3),(4,-10)

(0,0)

(-1,2),(0,2),(1,2),(2,2),(3,2)

(1,2),(1,3),(1,4),(1,5)


Ac代碼:





#include <stdio.h>//time 88ms #include <math.h> struct point{double x,y; }A,B; int main() {int i, j, x, y, t;double ty;scanf("%d", &t);while(t--) {scanf("%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y);printf("(%.lf,%.lf)", A.x, A.y);double k, b;k = (A.y-B.y) / (A.x-B.x);b = A.y - k*A.x;if(fabs(A.x - B.x) < 1e-6) {i = A.y+1;j = B.y;if(i <= j) {for(; i <= j; i++) printf(",(%.lf,%d)", A.x, i);}else {for(i = i-2; i >= j; i--) printf(",(%.lf,%d)", A.x, i);}} else if(fabs(k - 0) < 1e-6) {i = A.x+1;j = B.x;if(i <= j) {for(; i <= j; i++) printf(",(%d,%.lf)",i , A.y);} else {for(i = i-2; i >= j; i--) printf(",(%d,%.lf)",i , A.y);}} else {i = A.x+1;j = B.x;if(i <= j) {for(; i <= j; i++) {ty = k*i+b;if(ty > 0) ty += 0.5;else ty -= 0.5;y = ty;if(fabs((y-b)/k-i) < 1e-6) printf(",(%d,%d)",i , y);}} else {for(i = i-2; i >= j; i--) {ty = k*i+b;if(ty > 0) ty += 0.5;else ty -= 0.5;//這里要小心 y = ty;if(fabs((y-b)/k-i) < 1e-6) printf(",(%d,%d)",i , y);}}}printf("\n");}return 0; }


思路2:
用個例子比較好說,比如0 0 3 3,x和y每隔1就是一個符合題意得點,而0 1 2 4就是x隔2,y隔3時有符合題意的點

AC代碼:

#include <stdio.h>//time 48ms #include <stdlib.h> struct point{int x,y; }A,B; int gcd(int a, int b) {return a == 0 ? b : gcd(b%a, a); } int main() {int i, j, x, y, t, tx, ty, k, g;scanf("%d", &t);while(t--) {int fx = 1, fy = 1;scanf("%d%d%d%d", &A.x, &A.y, &B.x, &B.y);printf("(%d,%d)", A.x, A.y);x = B.x-A.x;y = B.y-A.y;g = gcd(abs(y),abs(x));ty = y/g;tx = x/g;i = A.x;j = B.x;k = A.y+ty;if(i < j) {for(i += tx; i <= j; i += tx, k += ty) printf(",(%d,%d)",i , k);} else if(i > j){for(i += tx; i >= j; i += tx, k += ty) printf(",(%d,%d)",i , k);} else {if(A.y < B.y)for(i = A.y+ty; i <= B.y; i += ty) printf(",(%d,%d)",A.x , i);else for(i = A.y+ty; i >= B.y; i += ty) printf(",(%d,%d)",A.x , i);}printf("\n");}return 0; }

總結

以上是生活随笔為你收集整理的nyoj878格点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。