Wednesday, August 14, 2013

UVa 404 - Radar Scopes

Accepted date: 2011-06-24
Ranking (as of 2013-08-14): 56 out of 118
Language: C++

/*
  UVa 404 - Radar Scopes

  To build using Visucal Studio 2008:
    cl -EHsc -O2 radar_scopes.cpp
*/

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <map>
#include <cfloat>
#include <cmath>
using namespace std;

const double pi = 2.0 * acos(0.0); // 3.14159265358979323846
const double radar_radius = 10.0; // in miles
const double radar_sweep_cycle = 5.0; // inseconds

enum warnings {
  unknown = -2, no_warnings, equipment_warning, new_intrusion, new_aloft,
  domain_exited, domain_loss
};

const char* warning_messages[] = {
  "equipment warning", "new intrusion", "new aloft", "domain exited",
  "domain loss"
};

struct airplane {
  string s_squawk; // squawk number in string
  int squawk; // squawk number, between 0 and 32767
  double azimuth; // in degrees between 0 and 360
  double distance; // in miles
  double speed; // in miles/hour
  int warning;
};

bool is_outside_of_radar_scope(const airplane& ap)
{
  return ap.distance +
    ap.speed * 1.10 * radar_sweep_cycle / 3600.0 >= radar_radius;
}

bool is_equipment_warning(const airplane& first, const airplane& second)
{
  double angle = (first.azimuth - second.azimuth) * pi / 180.0;
  double distance =sqrt(first.distance * first.distance +
    second.distance * second.distance
    - 2.0 * first.distance * second.distance * cos(angle));
  double measured_speed = distance * 3600.0 / radar_sweep_cycle;
  double average_speed = (first.speed + second.speed) / 2.0;
  return average_speed < measured_speed * 0.90 ||
    average_speed > measured_speed * 1.10;
}

int main(int /* argc */, char** /* argv */)
{
  int senario_nr = 1;
  int n1, n2;
  while (cin >> n1) {
    airplane ap;
    ap.warning = unknown;
    map<int, airplane> airplanes; // indexed by squawk numbers
    for (int i = 0; i < n1; i++) {
      cin >> ap.s_squawk;
      istringstream iss(ap.s_squawk);
      iss >> dec >> ap.squawk;
      cin >> dec >> ap.azimuth >> ap.distance >> ap.speed;
      airplanes.insert(make_pair(ap.squawk, ap));
    }
    cin >> n2;
    for (int i = 0; i < n2; i++) {
      cin >> ap.s_squawk;
      istringstream iss(ap.s_squawk);
      iss >> dec >> ap.squawk;
      cin >> dec >> ap.azimuth >> ap.distance >> ap.speed;
      map<int, airplane>::iterator j = airplanes.find(ap.squawk);
      if (j != airplanes.end())
        j->second.warning = (is_equipment_warning(j->second, ap)) ?
          equipment_warning : no_warnings;
      else { // not found in the first sweep
        ap.warning = (is_outside_of_radar_scope(ap)) ?
          new_intrusion : new_aloft;
        airplanes.insert(make_pair(ap.squawk, ap));
      }
    }
    cout << "Scenario # " << senario_nr++ << endl;
    for (map<int, airplane>::iterator i = airplanes.begin();
      i != airplanes.end(); i++) {
      airplane& ap = i->second;
      if (ap.warning == unknown) // not found in the second sweep
        ap.warning = (is_outside_of_radar_scope(ap)) ?
          domain_exited : domain_loss;
      if (ap.warning > no_warnings)
        cout << setw(5) << setfill(' ') <<
          ap.s_squawk << " -- " << warning_messages[ap.warning] << endl;
    }
    cout << endl; // after each scenario, print a blank line
  }
  return 0;
}

No comments:

Post a Comment