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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 计算几何专项训练(1) 【2318】【2398】【3304】【2653】【1556】【1066】...

發布時間:2025/3/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 计算几何专项训练(1) 【2318】【2398】【3304】【2653】【1556】【1066】... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

POJ 2318 TOYS

題意是在一個大矩形里有n條分割線把矩形分割成n+1部分、再給出一些玩具的坐標、要求統計每個部分內有多少個玩具、

具體做法就是二分求解出當前玩具右方的第一條線、這可以用叉積判斷、

Code:

varres:array [0..5002] of longint;p:array [0..5002] of record x1,x2,y1,y2:double;end;xx,yy,ldx,ldy,rux,ruy:double;n,m,i,l,r,mid:longint; function crossp(x1,y1,x2,y2:double):double;begincrossp:=x1*y2-x2*y1;end; function ok(now:longint):boolean;beginif crossp(p[now].x1-xx,p[now].y1-yy,p[now].x2-xx,p[now].y2-yy)>0 then exit(true) else exit(false);end; beginread(n);while n<>0 dobeginreadln(m,ldx,ruy,rux,ldy);for i:=1 to n dobeginreadln(p[i].x2,p[i].x1);p[i].y1:=ldy;p[i].y2:=ruy;end;p[0].x1:=ldx;p[0].x2:=ldx;p[0].y1:=ldy;p[0].y2:=rux;p[n+1].x1:=rux;p[n+1].x2:=rux;p[n+1].y1:=ldy;p[n+1].y2:=ruy;for i:=1 to m dobeginreadln(xx,yy);l:=1;r:=n+1;while l<r-1 dobeginmid:=(l+r) div 2;if ok(mid) then r:=mid else l:=mid;end;while (l>1) and ok(l-1) do dec(l);while not ok(l) do inc(l);inc(res[l-1]);end;for i:=0 to n dowriteln(i,': ',res[i]);writeln;fillchar(res,sizeof(res),0);read(n);end; end.

  

POJ 2398 TOY Storage

本題是上題的姊妹題,區別在于本題要求統計的是包含X個玩具的部分有多少、

P.S 上題的X坐標是有序給出的,而本題要先排序、

Code:

varres,app:array [0..1002] of longint;p:array [0..1002] of record x1,x2,y1,y2:double;end;xx,yy,ldx,ldy,rux,ruy:double;n,m,i,l,r,mid:longint; function crossp(x1,y1,x2,y2:double):double;begincrossp:=x1*y2-x2*y1;end; function ok(now:longint):boolean;beginif crossp(p[now].x1-xx,p[now].y1-yy,p[now].x2-xx,p[now].y2-yy)>0 then exit(true) else exit(false);end; procedure sort(l,r:longint);vari,j:longint;cx:double;begini:=l;j:=r;cx:=p[random(r-l+1)+l].x1;repeatwhile p[i].x1<cx do inc(i);while cx<p[j].x1 do dec(j);if i<=j thenbeginp[1002]:=p[i];p[i]:=p[j];p[j]:=p[1002];inc(i);dec(j);end;until i>j;if i<r then sort(i,r);if j>l then sort(l,j);end; beginread(n);while n<>0 dobeginreadln(m,ldx,ruy,rux,ldy);for i:=1 to n dobeginreadln(p[i].x2,p[i].x1);p[i].y1:=ldy;p[i].y2:=ruy;end;sort(1,n);p[n+1].x1:=rux;p[n+1].x2:=rux;p[n+1].y1:=ldy;p[n+1].y2:=ruy;for i:=1 to m dobeginreadln(xx,yy);l:=1;r:=n+1;while l<r-1 dobeginmid:=(l+r) div 2;if ok(mid) then r:=mid else l:=mid;end;while (l>1) and ok(l-1) do dec(l);while not ok(l) do inc(l);inc(res[l-1]);end;for i:=0 to n doinc(app[res[i]]);writeln('Box');for i:=1 to n doif app[i]<>0 thenwriteln(i,': ',app[i]);fillchar(app,sizeof(app),0);fillchar(res,sizeof(res),0);read(n);end; end.

  

POJ 3304 Segments

本題要求判斷是否存在一條直線通過給出的所有直線、

不難想到如果該直線不過任何一條直線的端點,一定可以讓它旋轉一定角度與某一個端點相碰;

而如果該直線只與某一個相碰,必然可以旋轉另一端點與另一個端點相碰、

于是,我們N^2枚舉出直線,然后判斷是否與每一條線段相交即可、

Code:

#include <iostream> #include <cstdio> #include <algorithm> #include <cmath>#define EPS 1e-8 #define sqr(x) ((x)*(x))using namespace std;double x[501],y[501]; int n,vv;double dis(double aa,double bb,double cc,double dd){return sqrt((aa-bb)*(aa-bb)+(cc-dd)*(cc-dd)); }double crossp(double aa,double bb,double cc,double dd){return aa*dd-bb*cc; }int judge(double x1,double y1,double x2,double y2){if (dis(x1,x2,y1,y2)<EPS) return 0;for (int j=1;j<=n*2;j++)if (j&1)if (crossp(x[j]-x1,y[j]-y1,x2-x1,y2-y1)*crossp(x2-x1,y2-y1,x[j+1]-x1,y[j+1]-y1)<0) return 0;return 1; }int main(){scanf("%d",&vv);while (vv--){scanf("%d",&n);for (int i=1;i<=n*2;i++)scanf("%lf%lf",&x[i],&y[i]);if (n==1){printf("Yes!\n");continue;}int succ=0;for (int i=1;i<=n*2 && !succ;i++)for (int j=i+1;j<=n*2 && !succ;j++)if (judge(x[i],y[i],x[j],y[j])) succ++;if (succ) printf("Yes!\n"); else printf("No!\n");} }

  

POJ 1269 Pick-up Sticks

本題來自于一個經典的……游戲?

題意主要就是每次放一條線段上去、如果后放的與先放的有交點就覆蓋掉先放的、

于是我們可以維護一個隨便什么鏈表、然后維護當前在頂上的線段編號、因為題目保證TOP線段不超過1000條、所以是可以無壓力通過的、、

Code:

#include <cstring> #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector>#define EPS 1e-9 #define sqr(x) ((x)*(x)) #define INF 1e9 #define pb push_backusing namespace std;struct segment{double sx,sy,ex,ey; }ss[100010];int n,top[1010],tt;double crossp(double x1,double y1,double x2,double y2){return x1*y2-x2*y1; }int cross(segment a,segment b){if (max(a.sx,a.ex)<min(b.sx,b.ex) || max(a.sy,a.ey)<min(b.sy,b.ey) \|| min(a.sx,a.ex)>max(b.sx,b.ex) || min(a.sy,a.ey)>max(b.sy,b.ey)) return 0;if (crossp(a.sx-b.sx,a.sy-b.sy,b.ex-b.sx,b.ey-b.sy)*crossp(b.ex-b.sx,b.ey-b.sy,a.ex-b.sx,a.ey-b.sy)>0 && \crossp(b.sx-a.sx,b.sy-a.sy,a.ex-a.sx,a.ey-a.sy)*crossp(a.ex-a.sx,a.ey-a.sy,b.ex-a.sx,b.ey-a.sy)>0) return 1;else return 0; }int main(){scanf("%d",&n);while (n){for (int i=1;i<=n;i++)scanf("%lf%lf%lf%lf",&ss[i].sx,&ss[i].sy,&ss[i].ex,&ss[i].ey);top[tt=1]=1;for (int i=2;i<=n;i++){for (int j=1;j<=tt;j++)if (cross(ss[top[j]],ss[i])) top[j]=-1;int cur=0;for (int j=1;j<=tt;j++)if (top[j]>0) top[++cur]=top[j];tt=cur;top[++tt]=i;}printf("Top sticks:");for (int i=1;i<tt;i++)printf(" %d,",top[i]);printf(" %d.\n",top[tt]);scanf("%d",&n);}return 0; }

  

POJ 1556 The doors

一看圖就知道是什么題了、

把所有出現的點全部建成一張圖,然后求解最短路就可以了。

Code:

#include <cstring> #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector>#define EPS 1e-9 #define sqr(x) ((x)*(x)) #define INF 1e9 #define pb push_backusing namespace std;struct segment{double sx,sy,ex,ey; }ss[100010];int n,top[1010],tt;double crossp(double x1,double y1,double x2,double y2){return x1*y2-x2*y1; }int cross(segment a,segment b){if (max(a.sx,a.ex)<min(b.sx,b.ex) || max(a.sy,a.ey)<min(b.sy,b.ey) \|| min(a.sx,a.ex)>max(b.sx,b.ex) || min(a.sy,a.ey)>max(b.sy,b.ey)) return 0;if (crossp(a.sx-b.sx,a.sy-b.sy,b.ex-b.sx,b.ey-b.sy)*crossp(b.ex-b.sx,b.ey-b.sy,a.ex-b.sx,a.ey-b.sy)>0 && \crossp(b.sx-a.sx,b.sy-a.sy,a.ex-a.sx,a.ey-a.sy)*crossp(a.ex-a.sx,a.ey-a.sy,b.ex-a.sx,b.ey-a.sy)>0) return 1;else return 0; }int main(){scanf("%d",&n);while (n){for (int i=1;i<=n;i++)scanf("%lf%lf%lf%lf",&ss[i].sx,&ss[i].sy,&ss[i].ex,&ss[i].ey);top[tt=1]=1;for (int i=2;i<=n;i++){for (int j=1;j<=tt;j++)if (cross(ss[top[j]],ss[i])) top[j]=-1;int cur=0;for (int j=1;j<=tt;j++)if (top[j]>0) top[++cur]=top[j];tt=cur;top[++tt]=i;}printf("Top sticks:");for (int i=1;i<tt;i++)printf(" %d,",top[i]);printf(" %d.\n",top[tt]);scanf("%d",&n);}return 0; }

  

POJ 1066 Treasure Hunt

本題大概是說、在(0,0)(100,100)的矩形內有若干線段把矩形分割成若干區域,然后給出一個寶藏的所在地(X,Y)求一條從邊界進入到達該點的路徑,使得該路徑通過的線段最少、

本題與3304有一定相似之處,不難發現只要枚舉所有線段的端點到(X,Y)組成的線段與其它線段的交點數就可以了、

Code:

#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring>using namespace std;struct segment{double beginx,beginy,endx,endy; }ss[1010];int n; double nx,ny; segment temp;double crossp(double x1,double y1,double x2,double y2){return x1*y2-x2*y1; }int cross(segment a,segment b){if (min(a.beginx,a.endx)>max(b.beginx,b.endx) ||\min(b.beginx,b.endx)>max(a.beginx,a.endx) ||\min(a.beginy,a.endy)>max(b.beginy,b.endy) ||\min(b.beginy,b.endy)>max(a.beginy,a.endy)) return 0;if (crossp(a.beginx-b.beginx,a.beginy-b.beginy,b.endx-b.beginx,b.endy-b.beginy)\*crossp(b.endx-b.beginx,b.endy-b.beginy,a.endx-b.beginx,a.endy-b.beginy)>0 &&\crossp(b.beginx-a.beginx,b.beginy-a.beginy,a.endx-a.beginx,a.endy-a.beginy)\*crossp(a.endx-a.beginx,a.endy-a.beginy,b.endx-a.beginx,b.endy-a.beginy)>0) return 1;return 0; }int main(){scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%lf%lf%lf%lf",&ss[i].beginx,&ss[i].beginy,&ss[i].endx,&ss[i].endy);scanf("%lf%lf",&nx,&ny);temp.endx=nx;temp.endy=ny;int ans=99999999;for (int i=1;i<=n;i++){int cnt=0;temp.beginx=ss[i].beginx;temp.beginy=ss[i].beginy;for (int j=1;j<=n;j++)if (cross(ss[j],temp)) cnt++;if (cnt<ans) ans=cnt;cnt=0;temp.beginx=ss[i].endx;temp.beginy=ss[i].endy;for (int j=1;j<=n;j++)if (cross(ss[j],temp)) cnt++;if (cnt<ans) ans=cnt;}if (ans==99999999) ans=0;printf("Number of doors = %d\n",ans+1);return 0; }

  

轉載于:https://www.cnblogs.com/JS-Shining/archive/2013/01/18/2866182.html

總結

以上是生活随笔為你收集整理的POJ 计算几何专项训练(1) 【2318】【2398】【3304】【2653】【1556】【1066】...的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产1区2区在线观看 | 久久精品亚洲无码 | 日本高清视频免费看 | 日韩在线一区二区三区 | 亚洲综合射 | 久久久久在线 | аⅴ资源新版在线天堂 | 国产色在线观看 | 一本一道久久a久久综合蜜桃 | 成人免费在线网站 | www四虎| 成人激情视频在线播放 | 免费在线国产精品 | 日韩在线观看免费网站 | 免费爱爱网站 | 不卡在线一区 | 男人喷出精子视频 | 五月天国产精品 | 国产综合久久 | 长河落日电视连续剧免费观看01 | 日本h片在线观看 | 亚洲欧美黄色片 | 亚洲艹| 午夜色网站| 久久精品国产视频 | 天天激情站 | 强伦人妻一区二区三区视频18 | 精品黑人一区二区三区在线观看 | 熟女少妇在线视频播放 | 亚洲精品乱码久久久久久国产主播 | 动漫美女被吸乳奶动漫视频 | 香蕉中文网 | 亚洲性色图| 人妻丰满熟妇av无码久久洗澡 | 成人久久网站 | 岛国av免费 | 免费高清毛片 | 亚洲 欧美 变态 另类 综合 | 免费黄色片网站 | 久久久久国产一区二区 | a视频在线看 | 色爱成人综合 | 午夜视频在线网站 | 国产日韩一区二区在线观看 | 男女猛烈无遮挡免费视频 | 国产午夜福利片 | 亚洲视频国产 | 亚洲精品成av人片天堂无码 | 99黄色| 国产传媒视频 | 亚洲国产精品国自产拍久久 | 国产精品高潮AV无码 | 亚洲麻豆av | 爱爱免费视频网站 | 国产大片中文字幕 | 少妇一级淫免费放 | 国产情侣自拍av | 九九热视| 免费看60分钟黄视频 | 91久久精品日日躁夜夜躁欧美 | 西欧毛片 | 91尤物视频在线观看 | 伊人黄 | 成年人在线免费 | 91黄色入口 | 免费日本在线 | 日本成人黄色 | 亚洲精品一品 | 天天爽夜夜爽 | 逼特逼在线视频 | 青青视频一区二区 | 欧美寡妇性猛交ⅹxxx | av免费观看入口 | 日本黄色免费视频 | 欧美精品在线一区二区三区 | 国产精品一区二区三区在线看 | 成人在线综合 | 日本三级韩国三级三级a级中文 | 国产精品成人免费一区二区视频 | 快播av在线 | 影音先锋在线视频观看 | 欧美做爰全过程免费观看 | 性高潮久久久久久 | 亚洲综合一区在线观看 | 精品久久久久久久久久久久久久久 | 精品人妻互换一区二区三区 | 亚洲精品粉嫩小泬20p | 亚洲国产欧美精品 | 中文字幕在线精品 | 久久精品视频免费看 | 99精品视频免费版的特色功能 | 手机版av | 麻豆app在线观看 | 国产伦精品一区二区三区免费 | 91国内产香蕉 | 国产日韩欧美成人 | 91视频网址入口 | www,久久久 | 天天摸天天做天天爽水多 |