UVa 11853 - Paintball(DFS)
2015-07-25 15:34
495 查看
书上给出了详细的思路,通过DFS判断,若连通上下边界就不能通过,若连通左右就更新解。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 1010; int n; bool vis[maxn]; double left, right; struct node { double x,y,r; bool inter(node a) { double dx = x - a.x, dy = y - a.y; return dx * dx + dy * dy - (r + a.r) * (r + a.r) <= 0; } } a[maxn]; bool dfs(int cur) { vis[cur] = true; if (a[cur].y - a[cur].r <= 0) return false; if (a[cur].x - a[cur].r <= 0) left = min(left, a[cur].y - sqrt(a[cur].r * a[cur].r - a[cur].x * a[cur].x)); if (a[cur].x + a[cur].r >= 1000) right = min(right, a[cur].y - sqrt(a[cur].r * a[cur].r - (1000 - a[cur].x) * (1000 - a[cur].x))); for (int i = 0; i < n; ++i) { if (vis[i]) continue; if (a[cur].inter(a[i])) if(!dfs(i)) return false; } return true; } void solve() { left = right = 1000; for (int i = 0; i < n; ++i) { if(!vis[i] && a[i].y + a[i].r >= 1000) if(!dfs(i)) { puts("IMPOSSIBLE"); return; } } printf("0.00 %.2lf 1000.00 %.2lf\n", left, right); } int main() { while (~scanf("%d", &n)) { memset(vis, 0, sizeof(vis)); for (int i = 0; i < n; ++i) scanf("%lf%lf%lf", &a[i].x, &a[i].y, &a[i].r); solve(); } return 0; }
相关文章推荐
- HDU 1302 The Snail
- http://blog.csdn.net/ooflywing/article/details/5616311
- HDU 2674-- N!Again【技巧】
- 最具体的历史centos下一个 postfix + extmail + dovecot + maildrop 安装注意事项2014更新
- HDU 5289 2015 Multi-University Training Contest 1 1002 RMQ+二分
- hdoj 2674 N!Again 【好题】
- Leetcode 11 Container With Most Water
- uva12546. LCM Pair Sum
- HDU 2473 Junk-Mail Filter (并查集的删除操作)
- 可笑的unsigned double http://blog.csdn.net/suhuaiqiang_janlay/article/details/6078034
- 动态规划,而已! CodeForces 433B - Kuriyama Mirai's Stones
- udp socket bind fail
- ZOJ 3675 Trim the Nails(bfs)
- 使用UltraISO制作启动盘装Windows系统详细教程
- AIX7.1+11.2.0.4RAC实施
- 如何提升 RailS 应用的性能?
- wait/waitpid函数使用
- hdu 1532 Drainage Ditches
- 第四篇:报错出现“Run-Time Check Failure #2-Stack around the variable 'p2240' was corrupted
- 【bfs】hdu 1104 Remainder