若是凉夜已成梦

青春里 总有些事情要努力去做 总有些梦想要拼命去追。


  • 运维

  • 前端

  • 编程

  • 随笔

  • hust-oj

1208: Problem E – Paintball

发表于 2017-10-06   |   分类于 HUSTOJ   |   阅读次数 1,300

题目描述

Problem E – Paintball
You are playing paintball on a 1000×1000 square field. A number of your opponents are on the field hiding behind trees at various positions. Each opponent can fire a paintball a certain distance in any direction. Can you cross the field without being hit by a paintball?
Assume that the southwest corner of the field is at (0,0) and the northwest corner at (0,1000). The input consists of a line containing n <= 1000, the number of opponents. A line follows for each opponent, containing three real numbers: the (x,y) location of the opponent and its firing range. The opponent can hit you with a paintball if you ever pass within his firing range.
You must enter the field somewhere between the southwest and northwest corner and must leave somewhere between the southeast and northeast corners.
If you can complete the trip, output four real numbers with two digits after the decimal place, the coordinates at which you may enter and leave the field, separated by spaces. If you can enter and leave at several places, give the most northerly. If there is no such pair of positions, print the line:
IMPOSSIBLE

输入

暂无

输出

暂无

样例输入

3
500 500 499
0 0 999
1000 1000 200

样例输出

0.00 1000.00 1000.00 800.00

参考代码

#include <stdio.h>
#include <math.h>
int n;
double x[1000], y[1000], r[1000];
int top[1000];
int possible = 1;
double ne = 1000, nw = 1000;
main() 
{
    int i,j,k;
    scanf("%d",&n);
    for (i=0;i<n;i++) scanf("%lf%lf%lf",&x[i],&y[i],&r[i]);
    for (i=0;i<n;i++) if (y[i]+r[i] > 1000) visit(i);
    /*
   if (possible) printf(
     "Bill enters at (0.00, %0.2lf) and leaves at (1000.00, %0.2lf).n",nw,ne);
   else printf("Bill will be bitten.n");
   */
    if (possible) printf(
         "0.00 %0.2lf 1000.00 %0.2lfn",nw,ne);
   else printf("IMPOSSIBLEn");
}
visit(int i){
   int j,k;
   double yy;
   if (top[i]++) return;
   for (j=0;j<n;j++) {
      if (hypot(x[j]-x[i],y[j]-y[i]) < r[i]+r[j]) visit(j);
   }
   if (y[i]-r[i] < 0) possible = 0;
   if (x[i]-r[i] < 0) {
      yy = y[i] - sqrt(r[i]*r[i] - x[i]*x[i]);
      if (yy < nw) nw = yy;
   }
   if (x[i]+r[i] > 1000) {
      yy = y[i] - sqrt(r[i]*r[i] - (1000-x[i])*(1000-x[i]));
      if (yy < ne) ne = yy;
   }
}

解析

暂无

hustoj

发表评论 取消回复

电子邮件地址不会被公开。 必填项已用*标注

*
*


hoxis wechat
著作权归作者所有
站点更新说明
  • 文章目录
  • 站点概览
若是凉夜已成梦

若是凉夜已成梦

青春里 总有些事情要努力去做 总有些梦想要拼命去追。

1904 日志
6 分类
12 标签
RSS
weibo github twitter facebook

友情链接

Skip Dreams孤独患者 原站点
© 2017 若是凉夜已成梦
Powered by WordPress | 已运行
Theme By NexT.Mist