TAKMIČENJA IZ PROGRAMIRANJA


Sva pitanja, predloge ili primedbe u vezi sa takmičenjima iz programiranja možete slati na e-mail:

tak.prog@gmail.com

U toku perioda za žalbe, sve žalbe možete slati na ovaj isti e-mail.

robot.cpp    536 b      izvorni kod rešenja
robot.checker.cpp    812 b      izvorni kod programa za testiranje
robot.checker.exe    24,710 b      program za testiranje
robot.tests.rar    2,097 b      test primeri

zadatak: Robot

Kompanija za izradu igračaka u kojoj ste zaposleni je počela da pravi novu vrstu robota. On ume da peva, govori, plače, rešava domaće zadatke i još dosta zanimljivih stvari. Svakako, jedna od najbitnijih karakteristika ovog robota je kretanje. Robot može da se kreće unapred ili da se okrene oko svoje ose za 90°. Zbog bolje orijentacije u prostoru, robotu je neophodno da uvek zna svoje koordinate. Kao članu projektnog tima koji se bavi softverom, dobili ste zadatak da na osnovu kretanja i okretanja robota odredite njegove koordinate.

Ulaz:

U prvom redu ulazne datoteke ZAD1.DAT, dati su prirodni brojevi N, X i Y, tako da važi 1 ≤ N, X, Y ≤ 1000. N je broj komandi koje izvršava robot, a X i Y su početne koordinate robota u metrima. U drugom redu se nalazi N slova, od kojih je svaki jedno od tri slova: "D", "L" ili "N" (velikim slovima). "D" označava okretanje za 90° u smeru kazaljki na satu, "L" u smeru suprotnom od smera kazaljki, dok "N" predstavlja kretanje unapred. Dužina jednog robotovog koraka je 1 metar. Robot je u početku okrenut tako da gleda u pozitivnom smeru x-ose.

Izlaz:

U prvom i jedinom redu izlazne datoteke ZAD1.RES treba ispisati dva cela broja, X i Y, razdvojena razmakom, koji predstavljaju konačnu poziciju robota.

Primer:

ZAD1.DAT      ZAD1.RES
6 2 2
NNNLNN
        
5 4
rešenje

Potrebno je u svakom trenutku voditi računa o trenutnoj poziciji robota, kao i o smeru u kome je on okrenut. Nakon učitavanja svakog sledećeg karaktera, ukoliko je on "D" ili "L", onda treba promeniti smer kretanja, a ako je "N", onda treba promeniti poziciju robota u zavisnosti od njegove prethodne pozicije i smera kretanja.

Pseudokod

   Read(N, X, Y)
   X1 = 1, Y1 = 0       //početni smer
   FOR I = 1 to N
      Read(C)
      IF (C = ‘N’)
         X = X + X1
         Y = Y + Y1
      ELSE IF (C = ‘L’)
         X2 = -Y1       //rotacija u pozitivnom smeru
         Y2 = X1        //suprtno od kazaljke
         X1 = X2
         Y1 = Y2
      ELSE
         X2 = Y1        //rotacija u negativnom smeru (kazaljke)
         Y2 = -X1 
         X1 = X2
         Y1 = Y2
   Write(X, Y)
fajl: robot.cpp
#include <fstream.h>

ifstream in("zad1.dat");
ofstream out("zad1.res");
int x, y, p, n;
char c;

void levo(){
  p = (p+1)%4;
}

void desno(){
  p = (p+3)%4;
}

void napred(){
  if (p == 0)
    x++;
  else if (p == 1)
    y++;
  else if (p == 2)
    x--;
  else
    y--;
}

int main(){
  p = 0;
  in >> n >> x >> y;
  for (int i = 0; i < n; i++){
    in >> c;
    if (c == 'L')
      levo();
    else if (c == 'D')
      desno();
    else napred();
  }
  out << x << " " << y << endl;
  in.close();
  out.close();
  return 0;
}