| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
大水,对精度没什么要求貌似,正常写就能过#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int n;
int main() {
int cnt = 0;
while(1){
scanf("%d", &n);
if(n==0) break;
cnt++;
printf("Scene %d\n", cnt);
int x[30], y[30], r[30];
for(int i = 1; i <= n; i++) scanf("%d%d%d", &x[i], &y[i], &r[i]);
int x0_, y0_, dx_, dy_;
scanf("%d%d%d%d", &x0_, &y0_, &dx_, &dy_);
double x0 = x0_, y0 = y0_, dx = dx_, dy = dy_;
double norm = sqrt(dx*dx + dy*dy);
dx /= norm, dy /= norm;
int hit = 0;
while(hit <= 10){
double tmin = 1000000000.0;
int arg = -1;
for(int i = 1; i <= n; i++){
double b = dx * (x0-x[i]) + dy * (y0-y[i]);
double a = dx*dx+dy*dy;
double c = (x0-x[i])*(x0-x[i]) + (y0-y[i])*(y0-y[i]) - r[i]*r[i];
double delta = b*b - a*c;
double t;
if(delta >= 0){
t = (-b-sqrt(delta))/a;
}
if(delta >= 0 && t >= 0){
if(t < tmin){
tmin = t;
arg = i;
}
}
}
if(arg == -1){
printf("inf\n");
break;
}
else if(hit == 10){
printf("...\n");
break;
}
hit++;
printf("%d ", arg);
double x_ = x0+tmin*dx, y_ = y0+tmin*dy;
x0 = x_, y0 = y_;
double tx = x_ - x[arg], ty = y_ - y[arg];
double tempDx = (ty*ty-tx*tx)*dx-2*tx*ty*dy, tempDy = dy*(tx*tx-ty*ty)-2*dx*tx*ty;
double norm = sqrt(tempDx*tempDx + tempDy*tempDy);
dx = tempDx/norm, dy = tempDy/norm;
}
printf("\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator