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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

UVa11853 Paintball

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVa11853 Paintball 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大概意思是,在給定一個矩形內,給定n個圓(0n1000)是障礙物,讓你找出一條路徑從x=0到x=1000 。開始我想錯了,后來看大佬的解釋,才知道原來可以自上而下以圓來做DFS,意思就是先找和y=1000相切或相交的圓,然后再做DFS,搜索與它相交或相切的圓,如果圓和x=0相切或相交,可以利用y-r*r-x*x求出最上邊那個點(畫個圖更容易理解)

同樣x=1000也是這樣求的。要注意的是必須要遍歷完所有和y=1000相交或相切的點,因為之前如果沒有到達最下面y=0,不代表下一個圓遍歷不到y=0。遍歷過的點不需要再遍歷。

#include<iostream> #include <string.h> #include <algorithm> #include<math.h> using namespace std; int n; struct Node {double x, y, r; }; double wid = 1000.00; Node Enemy[1010]; int vis[1010]; double start = 1000.00, endans = 1000.00; bool dfs(int u) {vis[u] = 1;if (Enemy[u].y - Enemy[u].r <= 0.0)return true;if(Enemy[u].x<=Enemy[u].r){start = min(Enemy[u].y-sqrt(Enemy[u].r*Enemy[u].r - Enemy[u].x*Enemy[u].x), start);}if(Enemy[u].x+Enemy[u].r>=wid){endans = min(Enemy[u].y-sqrt(Enemy[u].r*Enemy[u].r - (wid-Enemy[u].x)*(wid-Enemy[u].x)), endans);}for(int i=0;i<n;i++){if(!vis[i]&&(sqrt((Enemy[i].x-Enemy[u].x)*(Enemy[i].x-Enemy[u].x)+ (Enemy[i].y - Enemy[u].y)*(Enemy[i].y - Enemy[u].y))<=(Enemy[i].r+Enemy[u].r))){if(dfs(i))return true;}}return false; } int main() {while(cin >> n){memset(vis, 0, sizeof(vis));memset(Enemy, 0, sizeof(Enemy));for(int i=0;i<n;i++){cin >> Enemy[i].x >> Enemy[i].y >> Enemy[i].r;}bool isflag = false;for(int i=0;i<n;i++){if(Enemy[i].y+Enemy[i].r>=wid){if(!vis[i]&&dfs(i)){cout << "IMPOSSIBLE" << endl;isflag = true;break;}}}if(!isflag) printf("0.00 %.2lf 1000.00 %.2lf\n", start, endans);start = 1000.00; endans = 1000.00; }return 0; }

?

總結

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

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