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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

nyoj487点数

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

點數

時間限制:1000?ms ?|? 內存限制:65535?KB 難度:2 描述
在一個二維的坐標系內有三個點,這三個點構成一個三角形,請你求出這個三角形內部和邊界上的坐標點一共有多少個。 輸入
輸入三個整數點,坐標x,y均為1~99的整數。注意:程序以文件結束符“EOF”結束輸入。
輸出
按要求輸出點的個數,每個點占一行.
樣例輸入
0 0 0 1 3 0 0 0 2 0 0 2
樣例輸出
5 6

我的思路:設三角形三點為a,b,c,待檢測點為d。
若滿足:d和c在過ab的直線的同一側,且d和a在過bc的直線的同一側,且d和b在過ac的直線的同一側。
或 在三邊的任意一邊上

測試數據來幾發
0 0 1 1 2 2
8 2 9 1 3 5
7 9 3 1 9 8
答案
3
4
14

丑陋的AC代碼
#include <stdio.h> #include <math.h> struct point{double x,y; }p[3]; int onLine(point A[],double Dx, double Dy) {double k, b, tCy, tDy, tx, ty;for(int i = 0; i < 3; i++) {tx = A[i].x-A[(i+1)%3].x;ty = A[i].y-A[(i+1)%3].y;k = ty / tx;b = A[i].y - k*A[i].x;tDy = k*Dx + b;if(fabs(fabs(A[i].x-Dx)+fabs(A[(i+1)%3].x-Dx)-fabs(tx))<1e-6&&fabs(fabs(A[i].y-Dy)+fabs(A[(i+1)%3].y-Dy)-fabs(ty))<1e-6)if((fabs(A[i].x-A[(i+1)%3].x)<1e-6&&fabs(A[i].x-Dx)<1e-6)||(fabs(A[i].y-A[(i+1)%3].y)<1e-6&&fabs(A[i].y-Dy)<1e-6)||(fabs(tDy-Dy)<1e-6)) {return 1;//在三邊的任意一邊上就符合 }}return 0; } int getfg(point A, point B,point C,double Dx, double Dy) {int f1, f2;double k, b, tCy, tDy;k = (A.y-B.y) / (A.x-B.x);b = A.y - k*A.x;tCy = k*C.x + b;tDy = k*Dx + b;if(fabs(A.x - B.x) < 1e-6) {if(C.x < A.x) f1 = -1;else if(C.x > A.x) f1 = 1;else f1 = 0;if(Dx < A.x) f2 = -1;else if(Dx > A.x) f2 = 1;} else if(fabs(k-0) < 1e-6) {if(C.y < A.y) f1 = -1;else if(C.y > A.y) f1 = 1;else f1 = 0;if(Dy < A.y) f2 = -1;else if(Dy > A.y )f2 = 1;} else {if(C.y > tCy) f1 = -1;else if(C.y < tCy)f1 = 1;else f1 = 0;if(Dy > tDy) f2 = -1;else if(Dy < tDy) f2 = 1;}if(f1*f2 > 0) return 1;//表示同側else return 0; } int main() {double minX, maxX, minY, maxY;int i, j;while(~scanf("%lf%lf", &p[0].x, &p[0].y)) {int count = 0;maxX = p[0].x, maxY = p[0].y;minX = maxX, minY = maxY;for(i = 1; i < 3; i++) {scanf("%lf%lf", &p[i].x, &p[i].y);if(p[i].x > maxX) maxX = p[i].x;if(p[i].x < minX) minX = p[i].x;if(p[i].y > maxY) maxY = p[i].y;if(p[i].y < minY) minY = p[i].y;}//用外包最小矩形的方法縮小要查找的范圍 for(i = minX; i <= maxX; i++) {for(j = minY; j <= maxY; j++) {if(onLine(p,i,j)||getfg(p[0],p[1],p[2],i,j) && getfg(p[1],p[2],p[0],i,j) && getfg(p[0],p[2],p[1],i,j)) {count++;}}}printf("%d\n", count);}return 0; }

總結

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

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