UVa11853 Paintball
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 封装 继承 多态
- 下一篇: UVa712 S-Trees满二叉树