infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Mircea Pasoi din Septembrie 19, 2005, 23:05:12



Titlul: 114 Muzeu
Scris de: Mircea Pasoi din Septembrie 19, 2005, 23:05:12
Aici puteţi discuta despre problema Muzeu (http://infoarena.ro/problema/muzeu).


Titlul: 114 Muzeu
Scris de: marius gherman din Octombrie 30, 2005, 21:08:34
cam ce complexitate are Lee pentru o matrice n*n?
n*n cred poate


Titlul: 114 Muzeu
Scris de: Iorgulescu Calin din Octombrie 30, 2005, 21:16:37
O(N*N)  :-'


Titlul: 114 Muzeu
Scris de: marius gherman din Octombrie 30, 2005, 21:17:14
si banuiesc ca problema asta nu se face cu Lee nu ?


Titlul: 114 Muzeu
Scris de: cristi8 din Octombrie 30, 2005, 22:29:06
si de ce banuiesti tu ca nu se face cu Lee ?


Titlul: 114 Muzeu
Scris de: marius gherman din Octombrie 30, 2005, 22:45:56
mi se parea ciudat sa fie 0.1 secunde si sa fac backtracking la 250^250 dar banuiesc ca iterativ ar trebui sa mearga struna :-k


Titlul: 114 Muzeu
Scris de: cristi8 din Octombrie 30, 2005, 22:51:33
pai hotaraste-te. lee sau backtracking ?


Titlul: 114 Muzeu
Scris de: Rimovecz Ioan Mihai din Noiembrie 09, 2005, 13:08:18
Cu un Lee iti merge sigur mai ales ca graful este rar fiecare nod poate avea cel mult 4 muchii.Ai grija numai cum implementezi .


Titlul: 114 Muzeu
Scris de: Barca Cristian Mihai din Februarie 05, 2006, 19:20:20
d c e afisata matricea asa de ciudat?....chestia aia m-a indus in eroare! am crezut ca trebuie sa fac o afisare identica :oops: ! uitati-va la coloana cu numere pozitive si observati ca e mai in stanga!  :P


Titlul: Raspuns: 114 Muzeu
Scris de: Tabara Mihai din Aprilie 19, 2006, 17:58:07
O abordare cu backtracking duce la TLE pe cel putin 90% din teste(cel mai probabil).Problema se face clar cu Lee(cel putin ...pentru nivel de clasa X)..

Acuma incerc sa o fac si eu,deci inca nu prea e normal sa vorbesc.

P.S.Am o intrebare....cati paznici pot fi maxim?


Titlul: Raspuns: 114 Muzeu
Scris de: Tabara Mihai din Aprilie 20, 2006, 17:32:14
Nu mai conteaza numarul de paznici.Am facut-o dar iau numai 60 de puncte>pe restul iau TLE.
Am incercat doua abordari ->

Lee pe o coada si Lee pe doua cozi. Ambele solutii iau 60 de puncte si le-am optimizat la maxim.
Folosesc doar o matrice
Cod:
ok[i][j] pt conditiile de existenta ( '.' -> 1, '#' -> -2 ) si 
b[i][j] - cea dinamica pe care o tot reactualizez cu un lee pentru fiecare paznic.
Binenteles ca aici intra si coada(*respectiv cozile).Ma poate ajuta cineva cu niste idei in plus???(pls..... :-k)



Titlul: Raspuns: 114 Muzeu
Scris de: Toma Radu din Aprilie 22, 2006, 20:31:22
incearca sa faci lee-ul cu mai multe porniri, nu cate una pentru fiecare paznic.....ii mai rapid  :D


Titlul: Raspuns: 114 Muzeu
Scris de: Tabara Mihai din Aprilie 22, 2006, 21:34:05
incearca sa faci lee-ul cu mai multe porniri, nu cate una pentru fiecare paznic.....ii mai rapid  :D

 \:D/ \:D/A mers asa cum ai zis tu ...cu mai multe plecari ....am luat 100 =D> =D> =D>

gata...keep going :weightlift: :weightlift:


Titlul: Răspuns: 114 Muzeu
Scris de: Ionescu Vlad din Martie 29, 2007, 19:24:36
Mi-ati putea da un sfat in legatura cu pornirile multiple? Nu-mi iese nici cum, si fara nu iau peste 80 orice-as face, se pare...

Eu retin pozitiile paznicilor intr-o structura, pe care o parcurg si fac pe fiecare paznic lee. Cu porniri multiple am incercat sa parcurg structura din 2 in 2 si sa pun in coada paznicul i si i+1 dar abordarea astea mi-a adus o groaza de raspunsuri gresite si sigsegv-uri (si tot 2 TLE-uri...). Sunt pe drumul cel bun, sau trebuie altcumva? ???


Titlul: Răspuns: 114 Muzeu
Scris de: Sima Cotizo din Martie 29, 2007, 19:34:06
Incearca sa bagi in coada asa: intai toti paznicii pe care ii gasesti, o sa ai Q[ p ] primul paznic, Q[ u ] ultimul paznic...
Pe urma ia "while (p<=u)" si expandeaza nodul curent, indiferent de tipul lui (paznic sau nu), in aceeasi coada ... Si daca nu merge in aceeasi coada alocata static, atunci aloca dinamic si sterge toate elemetnele cozii de care nu ai nevoie (adica atunci cand te duci cu p in p->next, il si stergi pe p initial... ;) )...

Eu zic ca asta e cea mai usoara implementare de Lee :D ..


Titlul: Răspuns: 114 Muzeu
Scris de: Tabara Mihai din Martie 29, 2007, 19:42:16
coada alocata static, atunci aloca dinamic si sterge toate elemetnele cozii de care nu ai nevoie (adica atunci cand te duci cu p in p->next, il si stergi pe p initial...
Eu zic ca asta e cea mai usoara implementare de Lee :D ..

Nu stiu daca e nevoie de alocare dinamica.(  :-k ) Merge si fara, are la dispozitie memorie destula. (  :roll: ).Desi, cred ca ar merita sa incerce cum spui tu  :wink:

Secretul problemei cred ca era sa bagi in coada Q[p] paznici si sa lasi Lee-ul sa mearga singur. ( tin minte cat m-a enervat TLE-ul si pe mine la problema asta  :'( )

By the way, daca iese asta, merita sa incerci Barbar ( misto problema de tot  :ok: )


Titlul: Răspuns: 114 Muzeu
Scris de: Ionescu Vlad din Martie 29, 2007, 19:59:04
Va multumesc, a iesit! :)

O sa incerc si cu alocare dinamica. O intrebare in legatura cu asta: am vazut articole si pe site cum ca pointerii ar fi mai inceti. In cazul acesta, nu conteaza? La un concurs de exemplu, cum ar trebui implementata o coada sau stiva, pe vectori sau pe liste?


Titlul: Răspuns: 114 Muzeu
Scris de: Savin Tiberiu din Martie 29, 2007, 20:03:02
ideea de stergere de care zice sima cotizo poate fi implementata si folosind memorie statica, folosind ori o coada circulara (daca ai ajuns la sfarsit incepi si bagi de la inceput) dar trebuie sa ai grija sa o declari destul de mare in asa fel incat sa nu se suprapuna, sau folosind 2 cozi, una in care ai elementele curente si una in care le bagi pe cele noi, iar cand treci la pasul urmator copii din coada a 2-a in prima coada ;) astfel reduci foarte mult memoria, insa nu prea ai nevoie de astfel de optimizari. (decat pe la un oji unde lucrezi in borland)


Titlul: Răspuns: 114 Muzeu
Scris de: Ionescu Vlad din Martie 29, 2007, 20:09:51
Ce bine era sa stiu asta la oji...  ](*,)

Multumesc pentru ajutor :)


Titlul: Răspuns: 114 Muzeu
Scris de: Velciu Ionut din Martie 13, 2008, 08:18:05
ce matrice ati folosit ca mie imi dau prea multe variabile la 200x200 si primesc doar 40p   :oops:


Titlul: Răspuns: 114 Muzeu
Scris de: Ionescu Robert Marius din Martie 13, 2008, 08:52:19
poti folosi destula memorie ,mareste si tu matricea la 255 255 si daca nu ai alte greseli ar trebui sa-ti meagra


Titlul: Răspuns: 114 Muzeu
Scris de: Florian Marcu din Martie 13, 2008, 10:00:24
ce matrice ati folosit ca mie imi dau prea multe variabile la 200x200 si primesc doar 40p   :oops:

Hint: Fa asa incat un element sa il bagi in coada o singura data.  :)


Titlul: Răspuns: 114 Muzeu
Scris de: Pop Carla din Martie 10, 2009, 12:29:48
dc nu mai putem vedea sursele problemelor?  :'( ](*,) :readthis: :x :-'


Titlul: Răspuns: 114 Muzeu
Scris de: Andrei Misarca din Martie 10, 2009, 13:02:39
La problema asta nici nu cred ca s-au putut vedea vreodata sursele :)


Titlul: Răspuns: 114 Muzeu
Scris de: Onutu Catalin din Aprilie 17, 2009, 17:48:36
am si eu o problema, daca ma poate ajuta cineva:
iau doar 30 de pct: 5 incorecte si 2 TLE-uri si chiar nu pricep dc iau incorect.
am memorat pozitile paznicilor si am facut pe fiecare un Lee.

stie cineva care sa fie problema?


Titlul: Răspuns: 114 Muzeu
Scris de: Paul-Dan Baltescu din Aprilie 17, 2009, 20:32:03
Ideea ta nu duce la complexitatea optima. Daca sunt N^2 paznici, atunci o sa ai complexitate O(N^4) si de aceea iei TLE. Ca sa optimizezi, poti pune toti paznicii in coada la inceput si sa faci un singur Lee. Astfel ai complexitate O(N^2).

Motivul pentru care iei Incorect este, cel mai probabil, faptul ca ai implementat gresit.


Titlul: Răspuns: 114 Muzeu
Scris de: Vlad Costin din Aprilie 21, 2009, 20:40:58
 :x deci nush c are am facut lee si imi da 9 teste nu-mi da testul 7 spune k e incorect  [-X   :fighting:   ](*,)
 
chiar nu imi dau seama c nu poate sa imi dea

am pus intr-o coada toti pasnicii si cred k este bn adik 9teste /10 chiar nush ..


Titlul: Răspuns: 114 Muzeu
Scris de: gaboru corupt din Aprilie 21, 2009, 21:01:17
Ai grija sa pui coada de 100 000 (nevoie e doar de aprox 65 000 dar daca memoria iti permite  :-') si matricea sa fie de 255 pe 255.  Eu cand aveam matricea de 251 luam doar 70 de pct :)


Titlul: Răspuns: 114 Muzeu
Scris de: Posea Elena din Decembrie 28, 2009, 12:30:16
Nici mie nu-mi da testul 7. Oricum, eu aveam o gresala (dupa ce am reparat-o,tot 90 am luat...). S-ar pare ca nici un test nu verifica ce se intampla daca nu sunt deloc paznici.

Exista vreo sansa ca "o insula" de camere libere sa se transforme in camere inchise, doar pentru ca sunt inconjurate din toate partile
de camere inchise?("`#' pentru camera inchisa (prin care nu pot trece nici paznicii, dar in care nu pot intra nici hotii)";daca o zona e "bordata" de # nu poate sa intre nici hoti nici paznici...deci e inchisa?)

[editat de moderator] iti mai spun o data: nu mai posta consecutiv, ci editeaza-ti mesajele anterioare


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Februarie 08, 2010, 21:00:14
Buna. Am facut problema si imi da incorect la 3 teste. Care este problema ? http://infoarena.ro/job_detail/393084


Titlul: Răspuns: 114 Muzeu
Scris de: George Popoiu din Februarie 09, 2010, 11:15:54
De unde sa stim care este problema? Explica macar cum faci...poate e gresit algoritmul.


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Februarie 09, 2010, 13:12:31
Am descoperit greseala , am retinut ca si caractere si pentru numarul 10 spre exemplu nu il tinea ca si caracter. Dar am transformat totul in int si am reusit  :D


Titlul: Răspuns: 114 Muzeu
Scris de: Cirstean Paul din Martie 05, 2010, 01:17:21
Imi poate spune cineva dece la toate testele inafara de primul primesc Killed by signal 11(SIGSEGV)? ](*,) Eu iau cate un lee din fiecare P. Am inteles ca se poate face mai optim daca pui paznicii in coada la inceput.Dar nu prea stiu asa.


Titlul: Răspuns: 114 Muzeu
Scris de: Vlad Eugen Dornescu din Martie 05, 2010, 07:32:35
Eu am pus pozitiile primilor doi paznici in coada, si am dat drumul la lee.S-ar putea sa nu fi declarat cozile indeajuns de mari.


Titlul: Răspuns: 114 Muzeu
Scris de: Neagu Bogdan Ioan din Martie 17, 2010, 23:15:55
Vai....ii cam puscat asta de commuri...am atasat ceva nesuportat si nu o tinut minte ce am scris...vai.....de la capat. Salut tuturor. Am incercat si eu sa fac acest program si in afara de primele 3 teste imi da time limit exceded. Eu nu am memorat nicio pozitie pt niciun paznic...doar am facut pur si simplu lee sa actioneze in stilul clasic, iar in matricea folosita am initializat paznicii cu 0, camere interzise cu -2 si restul cu -1, mai apoi sa fie schimbate in cadrul lee. E cam suspect totusi ca numai pt citirea si afisarea fisierelor text la cel mai "mancator" test imi ia 28 de ms....apoi la lee cat sa mai zic ca ii ia... ](*,)....apropo eu folosesc fpc  \:D/ asa ca daca e vreun binevoitor astept sfaturi. va multumesc, am atasat si programul.


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Martie 18, 2010, 14:16:30
M-am uitat peste sursa ta, greseala ta este ca trebuie sa folosesti o coada in care sa bagi pozitiile celor doi paznici, si sa faci Lee atata timp cat nu mai ai elemente in coada. Asa e varianta optima .


Titlul: Răspuns: 114 Muzeu
Scris de: Gabriel Bitis din Martie 18, 2010, 14:35:45
M-am uitat peste sursa ta, greseala ta este ca trebuie sa bagi in coada pozitiile celor doi paznici, si sa faci Lee atata timp cat nu mai ai elemente in coada.
Peste ce sursa te'ai uitat? Nu e nicio coada acolo.

@ Neagu Bogdan

Ai complexitate prea mare: O(N^2 * distantaMaxima), de aceea iei TLE. Ca sa iti intre in timp, trebuie sa folosesti algoritmul lui Lee (probabil asta incerca sa zica Robert Simoiu in postul anterior).

L.E. @Robert : Tu vezi greseli care nu exista.


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Martie 18, 2010, 14:37:49
Stiu ca nu are coada, aia ziceam si eu  :aha:


Titlul: Răspuns: 114 Muzeu
Scris de: Neagu Bogdan Ioan din Martie 18, 2010, 18:14:36
Nu prea inteleg ce coada (adica vector ma gandesc) mai trebuie sa folosesc...si nici cu complexitatile nu le stiu  :'( . Dar am mai facut o versiune care dupa parerea mea ar trebui sa fie mult mai rapida....am mai pus 2 vectori, in primu iau poz paznicilor, apoi in al doilea pun pozitiile unde am incrementat, apoi in primu pun tot ce ii in 2 si tot asa...acum nu mai ia fiecare element la cautat ci stie sigur care le are de incrementat ...dar tot 30 de pct iau... il atasez...si daca puteti da mai multe detalii vas fi recunoscatori... eu din ce am vazut lee nu era numa cu matrice si altfel nu am vazut...insa cred ca asta e una dintre cele mai neoptimizate metode. Astept raspunsuri in continuare si va multumesc pentru ajutor.


Titlul: Răspuns: 114 Muzeu
Scris de: Florian Marcu din Martie 18, 2010, 19:26:32
Din spusele tale, observ ca tu nu cunosti notiunea de coada. Daca nu stii sa folosesti o coada, atunci nu poti face nici Lee. Iar faptul ca nu stii Lee, implica faptul ca nu poti rezolva corect si eficient problema asta. Concluziile ( doar una adevarata ):
1. invata coada, apoi Lee .
2. observatia mea e gresita ( si imi cer scuze )


Titlul: Răspuns: 114 Muzeu
Scris de: Neagu Bogdan Ioan din Martie 18, 2010, 19:29:35
Din spusele tale, observ ca tu nu cunosti notiunea de coada. Daca nu stii sa folosesti o coada, atunci nu poti face nici Lee. Iar faptul ca nu stii Lee, implica faptul ca nu poti rezolva corect si eficient problema asta. Concluziile ( doar una adevarata ):
1. invata coada, apoi Lee .
2. observatia mea e gresita ( si imi cer scuze )

pai coada nu e un vector? ai vazut programul meu? Daca poti imi explici te rog cum ce este acea "coada"? si indicatii pentru rezolvarea problemei?


Titlul: Răspuns: 114 Muzeu
Scris de: George Popoiu din Martie 18, 2010, 19:37:37
Cred ca faci confuzie. Da, coada o poti implementa ca un vector.

Daca stii ce este o stiva poti face o analogie.

Daca tii un vector asupra caruia tu impui niste restrictii si il folosesti intr-un anumit fel, poti sa spui ai o stiva sau o coada, etc.

Daca vrei sa intelegi mai bine structurile astea iti sugerez sa incerci sa le folosesti din STL sau sa le implementezi tu (daca stii sa aloci dinamic memorie sau OOP) , atunci cred ca vei intelege cu adevarat semnficatia lor.


Titlul: Răspuns: 114 Muzeu
Scris de: Neagu Bogdan Ioan din Martie 18, 2010, 19:40:35
Cred ca faci confuzie. Da, coada o poti implementa ca un vector.

Daca stii ce este o stiva poti face o analogie.

Daca tii un vector asupra caruia tu impuii niste restrictii si il folosesti intr-un anumit fel, poti sa spui ai o stiva sau o coada, etc.

Daca vrei sa intelegi mai bine structurile astea iti sugerez sa incerci sa le folosesti din STL sau sa le implementezi tu (daca stii sa aloci dinamic memorie sau OOP) , atunci cred ca vei intelege cu adevarat semnficatia lor.

 :-s mai cam lasat in ceata...:D nu stiu cei ala STL...daca e ceva din C++, eu folosesc fpc. Sa aloc dinamic memorie nu stiu dar nu e asa de greu din cate am vazut in help, insa nu stiu cu ce m-ar ajuta, iar OOP iar nu am nici cea mai vaga idee ce este  :sad:


Titlul: Răspuns: 114 Muzeu
Scris de: Florian Marcu din Martie 18, 2010, 19:53:24
Atunci ia-ti un manual de info ( a-10a, a-11a ) si spor la invatat.  :) Apoi, revino la problema "muzeu". Deja suntem off topic.  :)


Titlul: Răspuns: 114 Muzeu
Scris de: Neagu Bogdan Ioan din Martie 18, 2010, 20:54:12
si...inca o intrebare...cam tarziu dar mia dat-o profa problema sa o fac insa nu stiu cat de mult s-a uitat la ea...pentru ce clasa e? Ca eu sunt doar a 9a :D :roll:


Titlul: Răspuns: 114 Muzeu
Scris de: Vlad Eugen Dornescu din Martie 18, 2010, 21:22:11
Lee-ul e in programa de intensiv  la a clasa a 10-a


Titlul: Răspuns: 114 Muzeu
Scris de: Neagu Bogdan Ioan din Martie 19, 2010, 08:21:24
nu stiti cumva unde as putea gasi un algoritm lee asemanator cu cel folosit in aceasta problema sau rezolvarea la aceasta problema pentru ca nu o gasesc niciunde, iar rezolvarile facute de ceilalti nu le pot downloada  :'(


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Martie 19, 2010, 15:17:03
Ti-as putea da eu, ti-am trimis P.M.


Titlul: Răspuns: 114 Muzeu
Scris de: Vlad Tarniceru din August 02, 2010, 14:09:56
trebuie afisat ordonat ca in exemplu?(adica de exemplu:

 1 -2  3 -2
-2  3  4  5

?


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din August 02, 2010, 14:27:30
Trebuie sa afisezi matricea exact cum era ea initial, doar ca trebuie pus in loc de ziduri o cifra etc .


Titlul: Răspuns: 114 Muzeu
Scris de: FMI - Roscaneanu George din Februarie 01, 2011, 00:02:52
Moamah dar ce zgarcit este atunci cand verifica solutia
Cand folosesc printf("%3d",v[j]); imi da 0 puncte
Dar cand folosesc printf("%d " v[j]); mia dat 100

Trebuie sa specifice ca intre numere trebuie sa fie doar un spatiu, eu am pus cu format ca era mai aranjat asa.


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Februarie 01, 2011, 09:33:40
Foloseste [ i ] , pentru ca el inseamna scris italic. Apoi in enunt scrie asa :
Citat
In fisierul muzeu.out veti afisa N linii, fiecare din ele continand N numere intregi (separate prin spatii).


Titlul: Răspuns: 114 Muzeu
Scris de: Chibici Tiberiu din Februarie 26, 2011, 14:30:04
Iau doar 60 puncte si nu imi dau seama de ce...

Am implementat Lee, si culmea... cu coada de 1000*500 elemente iau 50 pct (5 incorecte);
cu coada 1000*1000 iau 60 puncte (4 incorecte)
cu coada mai lunga incep sa iau TLE.

Cu toate ca am pus o functie "Purge" care sa stearga elem folosite cand se umple.

Cod:
#define DEBUG 0
#define MAXSTACK 1000*1000
#include<fstream>
#include<cstdlib>
#if DEBUG==1
#include<iostream>
#endif

using namespace std;


class Point
{
public:
    short X, Y;

    Point() { X = Y = 0; }
    Point(short x, short y) { X = x; Y = y; }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }
    Point operator- (Point a)
    {
        return Point(X - a.X, Y - a.Y);
    }
    Point* operator= (const Point* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }

#if DEBUG==1
    friend ostream& operator<<(ostream& output, const Point &p)
    {
        output<<p.X<<","<<p.Y;
        return output;
    }
#endif
};

class PointStep : public Point
{
public:
    short Step;

    PointStep() { X = Y = 0; }
    PointStep(short x, short y) { X = x; Y = y; }
    PointStep(short x, short y, int step) { X = x; Y = y; Step = step; }
    PointStep(Point w, int step) { X = w.X; Y = w.Y; Step = step; }

    PointStep operator+ (PointStep a)
    {
        return PointStep(a.X + X, a.Y + Y);
    }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep operator- (PointStep a)
    {
        return PointStep(X - a.X, Y - a.Y);
    }

    Point operator- (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep* operator= (const PointStep* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }
};

const Point Directions[4] = {Point(0, -1), Point(1, 0), Point(0, 1), Point(-1, 0) };

int Map[260][260];
short MapSize;

PointStep Stack[MAXSTACK];
int StackSize, StackPos;


inline void Purge()
{
    for (int i = StackPos; i < StackSize; i++)
        Stack[i-StackPos] = Stack[i];

    StackPos = 0;
    StackSize -= StackPos;
}

inline void StackAdd(Point w, int step)
{
    Stack[StackSize++] = PointStep(w, step);

    if (StackSize >= MAXSTACK-2) Purge();
}

//**** Implementations of ReadFile / WriteFile
// ...
// ****

inline bool Okay (Point w, int pas)
{
    if (w.X < 0 || w.Y < 0 || w.X >= MapSize || w.Y >= MapSize) return false;
    if (Map[w.X][w.Y] == -1) return true;
    if (Map[w.X][w.Y] > pas) return true;

    return false;
}

void Lee()
{
    Point d;
    int pas = 0;

    while (StackPos < StackSize) {
        pas = Stack[StackPos].Step;
        for (int direction = 0; direction < 4; direction++)
        {
            d = Stack[StackPos] + Directions[direction];

            if (Okay(d, pas))
            {
                StackAdd(d, pas+1);
                Map[d.X][d.Y] = pas+1;
            }
        }

        StackPos++;
    }
}


int main()
{
    ReadFile("muzeu.in");
    Lee();
    WriteFile("muzeu.out");

    return 0;
}



Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Februarie 26, 2011, 14:44:16
Cel mai bine ar fi sa utilizezi coada dinamica din STL.


Titlul: Răspuns: 114 Muzeu
Scris de: Chibici Tiberiu din Februarie 26, 2011, 16:20:32
Cel mai bine ar fi sa utilizezi coada dinamica din STL.

Merci de sfat.

Am incercat si asa, dar tot 60 pct iau. Primesc TLE la testul 6, si Incorect  la 7 8 9


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Februarie 26, 2011, 16:21:50
Ai folosit <queue> si .pop, respectiv .push ?


Titlul: Răspuns: 114 Muzeu
Scris de: Chibici Tiberiu din Februarie 26, 2011, 16:29:28
Ai folosit <queue> si .pop, respectiv .push ?

Da!

Aici este sursa noua:
Cod:
#define DEBUG 0
#define MAXSTACK 1000*1000
#include<fstream>
#include<cstdlib>
#include<queue>
#if DEBUG==1
#include<iostream>
#endif

using namespace std;


class Point
{
public:
    short X, Y;

    Point() { X = Y = 0; }
    Point(short x, short y) { X = x; Y = y; }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }
    Point operator- (Point a)
    {
        return Point(X - a.X, Y - a.Y);
    }
    Point* operator= (const Point* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }

#if DEBUG==1
    friend ostream& operator<<(ostream& output, const Point &p)
    {
        output<<p.X<<","<<p.Y;
        return output;
    }
#endif
};

class PointStep : public Point
{
public:
    short Step;

    PointStep() { X = Y = 0; }
    PointStep(short x, short y) { X = x; Y = y; }
    PointStep(short x, short y, int step) { X = x; Y = y; Step = step; }
    PointStep(Point w, int step) { X = w.X; Y = w.Y; Step = step; }

    PointStep operator+ (PointStep a)
    {
        return PointStep(a.X + X, a.Y + Y);
    }

    Point operator+ (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep operator- (PointStep a)
    {
        return PointStep(X - a.X, Y - a.Y);
    }

    Point operator- (Point a)
    {
        return Point(a.X + X, a.Y + Y);
    }

    PointStep* operator= (const PointStep* a)
    {
        this->X = a->X;
        this->Y = a->Y;
        return this;
    }
};

const Point Directions[4] = {Point(0, -1), Point(1, 0), Point(0, 1), Point(-1, 0) };

int Map[260][260];
short MapSize;

queue<PointStep> Queue;

void ReadFile(char* fileName)
{
    char buffer[250];
    ifstream in (fileName);

    in>>MapSize;
    in.getline(buffer, 250, '\n');

    for (short x=0; x < MapSize; x++)
    {
        in.getline(buffer, 250, '\n');
        for (short y=0; y < MapSize; y++)
            switch (buffer[y])
            {
                case '#': Map[x][y] = -2; break;
                case 'P': Map[x][y] = 0; Queue.push(PointStep(x, y, 0)); break;
                default: Map[x][y] = -1; break;
            }
    }

    in.close();
}

void WriteFile(char* fileName)
{
    ofstream out (fileName);

    for (int x=0; x< MapSize; x++, out<<endl)
        for (int y=0; y<MapSize; y++)
            out<<Map[x][y]<<" ";
}

inline bool Okay (Point w, int pas)
{
    if (w.X < 0 || w.Y < 0 || w.X >= MapSize || w.Y >= MapSize) return false;
    if (Map[w.X][w.Y] == -1) return true;
    if (Map[w.X][w.Y] > pas) return true;

    return false;
}

void Lee()
{
    Point d;
    int pas = 0;

    while (!Queue.empty()) {
        PointStep temp = Queue.front();
        pas = temp.Step;
        for (int direction = 0; direction < 4; direction++)
        {
            d = temp + Directions[direction];

            if (Okay(d, pas))
            {
                Queue.push(PointStep(d, pas+1));
                Map[d.X][d.Y] = pas+1;
            }
        }

        Queue.pop();
    }
}


int main()
{
    ReadFile("muzeu.in");
    Lee();
    WriteFile("muzeu.out");

    return 0;
}



Titlul: Răspuns: 114 Muzeu
Scris de: Mihai Visuian din Decembrie 01, 2011, 20:15:03
cum pot sa aflu nodurile ce pot fi atinse de paznici? Ma refer la parcurgerea in latime


Titlul: Răspuns: 114 Muzeu
Scris de: c a e n din Decembrie 02, 2011, 09:44:00
Eu am incercat sa o fac cu un Lee implementat cu o coada (sunt a 10-a si nu stiu altfel) si iau doar 50, pe restul iese din timp. Retin coordonatele paznicilor intr-un struct si pentru fiecare paznic fac Lee. Gresesc undeva, sau Lee-ul pe care il fac eu nu ar trebui sa intre in timp?


Titlul: Răspuns: 114 Muzeu
Scris de: Simoiu Robert din Decembrie 02, 2011, 10:53:46
Deci in acea coada bagi toate coordonatele paznicilor, si faci un singur lee, adica lee-ul normal il faci cu un singur paznic bagat, aici ii bagi pe toti si faci un lee, si atat :).


Titlul: Răspuns: 114 Muzeu
Scris de: Sireanu Roland din Decembrie 24, 2011, 09:51:15
Buna ziua , imi poate spune cineva cum fac matricea de adiacenta pentru a rezolva problema cu parcurgerea in latime ? Multumesc.


Titlul: Răspuns: 114 Muzeu
Scris de: Dragos-Alin Rotaru din Decembrie 24, 2011, 11:37:46
Consideri ca matricea este un graf in care ai muchii din (i, j) in { (i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1) }, exceptiile fiind casutele avand caracterul '#' , in care nu poti trasa muchii din / spre acea pozitie.


Titlul: Răspuns: 114 Muzeu
Scris de: Sireanu Roland din Decembrie 24, 2011, 13:49:06
Ok , deci casutele cu caracterul " # " le pot considera noduri izolate . Multumesc.


Titlul: Răspuns: 114 Muzeu
Scris de: Albu Alexandru din Februarie 04, 2012, 17:41:25
Cine imi poate spune cum as putea face programul meu mai rapid, sau unde gresesc? Eu am facut cu Lee pentru ca nu am invatat grafuri.


Titlul: Răspuns: 114 Muzeu
Scris de: Cosmin Ionut din Septembrie 24, 2012, 20:34:32
Nu iau TLE , dar am probleme la 6 teste cu WA.
Daca ar fi cineva dispus sa ma ajute as fi mai mult decat bucuros  :'(.


Titlul: Răspuns: 114 Muzeu
Scris de: FMI Razvan Birisan din Decembrie 02, 2012, 08:41:07
Iau TLE pe 2 teste. :?

Plec de la fiecare paznic și fac Lee.


Titlul: Răspuns: 114 Muzeu
Scris de: George Marcus din Decembrie 02, 2012, 08:51:54
Pleaca de la inceput din toti paznicii (ii bagi in coada).


Titlul: Răspuns: 114 Muzeu
Scris de: FMI Razvan Birisan din Decembrie 02, 2012, 09:55:43
Cod:
    for( i = 0 ; i <= k ; ++i )
    {
        c[0].x = p[i].r;
        c[0].y = p[i].t;
        for( g = 0 , ind = 0 ; g <= ind ; ++g )
...

http://infoarena.ro/job_detail/827451

iau 80p. :?


Titlul: Răspuns: 114 Muzeu
Scris de: George Marcus din Decembrie 02, 2012, 10:20:30
Nu m-ai inteles.
Ii bagi in coada pe toti de la inceput. Cam asa:
Cod:
for(i = 0; i <= k; i++) {
   c[i].x = p[i].r;
   c[i].y = p[i].t;
}
ind = k;
si apoi faci parcurgerea.

Si atunci cand gasesti pe cineva cu distanta mai mica, verifica daca nu e introdus deja in coada ca sa nu bagi de mai multe ori aceeasi celula.


Titlul: Răspuns: 114 Muzeu
Scris de: FMI Razvan Birisan din Decembrie 02, 2012, 10:55:38
Merci pentru ajutor. :D

Acum am înțeles. :winner1:


Titlul: Răspuns: 114 Muzeu
Scris de: Cosmin Rusu din Ianuarie 03, 2013, 14:27:24
Cod:
//Problema muzeu
#include<fstream>
#include<iostream>
using namespace std;
 
int a[251][251],i,j,ok,u,p,q[3][20001],c,d,y,sir[3][100000],maxi,l[251][251],n,k=0;
ifstream fin("muzeu.in");
ofstream g("muzeu.out");
 
void init()
 
{
       
     //citim datele din fisierul muzeu.in
     fin>>n;
   //  cout<<n;
     char c;
      for(i=1;i<=n;i++)
             for(j=1;j<=n;j++)
            { fin>>c;
             if (c=='.')
             { a[i][j]=1;
              l[i][j]=-1;
              }
             else if (c=='P') {a[i][j]=10;k++;sir[1][k]=i;sir[2][k]=j;}
                                else l[i][j]=-2;
                                }
             fin.close();
         
           
}
//instroduc linia c si col d in coada
void intr(int c,int d)
{
     u=u+1;
      if(u>20000)
       u=1;
         
       q[1][u]=c;
       q[2][u]=d;
}
//extrag un element din coada
void extr(int &c,int &d)
{
     p=p+1;
     if(p>20000)
     p=1;
       
     c=q[1][p];
     d=q[2][p];
}
 
//algoritmul LEE
void lee(int x,int y)
{
     p=0;u=0;
     intr(x,y);
     while(p!=u)
    { extr(x,y);
     
   //vecinul de sus
   //daca are inaltime mai mare si numarul de catarari mai mic atunci
   //actualizez numarul de catarari cu l[x][y]+1
     if(x>1)
       
      if(a[x-1][y]==1)
       if(l[x-1][y]>l[x][y]+1||l[x-1][y]==-1)
       {l[x-1][y]=l[x][y]+1;
       intr(x-1,y);
 
      }
       
     //
      if(x<n)
       if(a[x+1][y]==1)
        if(l[x+1][y]>l[x][y]+1||l[x+1][y]==-1)
        {l[x+1][y]=l[x][y]+1;
         intr(x+1,y);
   
         }
 
    if(y>1)
     if(a[x][y-1]==1)     
           if(l[x][y-1]>l[x][y]+1||l[x][y-1]==-1)
           {l[x][y-1]=l[x][y]+1;
                                  intr(x,y-1);
         
                                  }
    if(y<n)
     if(a[x][y+1]==1)
      if(l[x][y+1]>l[x][y]+1||l[x][y+1]==-1)
    {l[x][y+1]=l[x][y]+1;
    intr(x,y+1);
   
    }
     
}
 
}
void scriere()
{
 
             
       
      for(i=1;i<=n;i++)
             {g<<"\n";
                          for(j=1;j<=n;j++)
              g<<l[i][j]<<" ";}
     maxi=-1;
    //  for(i=1;i<=n;i++)
     //  for(j=1;j<=n;j++)
       // if(l[i][j]>maxi)
       // maxi=l[i][j];
   
}
int main()
{
   
    init();
    for(i=1;i<=k;i++)
     lee(sir[1][i],sir[2][i]);
     
     scriere();
   
    return 0;
}
Ma puteti ajuta si pe mine sa vad ce gresesc aici :)?  Sursa mea nu trece doua dintre teste cu textul Time limit exceeded. Multumesc anticipat !


Titlul: Răspuns: 114 Muzeu
Scris de: Pirtoaca George Sebastian din Ianuarie 03, 2013, 15:04:48
Incearca sa bagi toti paznicii in coada de la inceput si pe urma ruleaza parcurgerea.  :ok:


Titlul: Răspuns: 114 Muzeu
Scris de: Cosmin Rusu din Ianuarie 03, 2013, 15:17:41
Cred ca fac asta in functia init . Nu am prea inteles ce vroiai sa zici, poti fi mai explicit te rog  :)?


Titlul: Răspuns: 114 Muzeu
Scris de: Visan Radu din Ianuarie 03, 2013, 15:24:56
Tu faci lee din fiecare paznic (liniile 120 si 121). Ca sa mearga mai repede, bagi in coada de la inceput toti paznicii si faci lee o singura data (adica la linia 57 introduci toti cei k paznici in coada).


Titlul: Răspuns: 114 Muzeu
Scris de: Pirtoaca George Sebastian din Ianuarie 03, 2013, 16:21:04
Exact.  :D


Titlul: Răspuns: 114 Muzeu
Scris de: FMI Alexandru Banu din Martie 25, 2013, 10:28:17
Imi ziceti va rog ce inseamna KBS 6 (SIGABRT)? Din cauza la asta nu iau 3 teste.  ](*,)Daca e nevoie de sursa, ziceti-mi si vi-o dau prin PM.


Titlul: Răspuns: 114 Muzeu
Scris de: Radu-Andrei Szasz din Martie 25, 2013, 11:28:58
Fi atent la limite. Declari matricea de 251 si accesezi elementul 251 in functia bordare(indexarea unui vector incepe de la 0, deci ultimul element este N - 1). Ai putea sa iei KBS de la asta.


Titlul: Răspuns: 114 Muzeu
Scris de: FMI Alexandru Banu din Martie 25, 2013, 12:06:00
Mersi, a mers! :ok:


Titlul: Răspuns: 114 Muzeu
Scris de: CHIRILA ADRIAN din Noiembrie 07, 2013, 17:06:10
Am facut cu algoritmul lui Le...i-am introdus in coada pe gardieni...dar nu stiu de ce i-au pe testele 3,4,9 killed by signal http://www.infoarena.ro/job_detail/1023715 (http://www.infoarena.ro/job_detail/1023715)...sursa: http://www.infoarena.ro/job_detail/1023715?action=view-source (http://www.infoarena.ro/job_detail/1023715?action=view-source).


Titlul: Răspuns: 114 Muzeu
Scris de: FMI Trifan Mircea Mihai din Noiembrie 07, 2013, 18:04:29
Salut, incearca while-ul asta
Cod:
while(!d.empty())
    {
        int x,y;
        x=d.front();d.pop_front();
        y=d.front();d.pop_front();
        lee(x,y);
        x=d.front();d.pop_front();
        y=d.front();d.pop_front();
        lee(x,y);
    }
sa-l inlocuiesti cu asta
Cod:
while(!d.empty())
    {
        int x,y;
        x=d.front();d.pop_front();
        y=d.front();d.pop_front();
        lee(x,y);
    }


Titlul: Răspuns: 114 Muzeu
Scris de: CHIRILA ADRIAN din Noiembrie 07, 2013, 18:50:16
Merge..nu stiu de ce am mi-a venit sa apelez de doua ori functia lee(x,y).. si mai ales nu stiu de ce in prima faza am luat wa pe alea 3 teste.


Titlul: Răspuns: 114 Muzeu
Scris de: FMI Trifan Mircea Mihai din Noiembrie 07, 2013, 19:14:45
nu ai luat wa, ai luat kbs. in prima faza exista posibilitatea ca deque-ul pe care il foloseai sa devina vid inainte sa apelezi x=d.front(); d.pop_front(); ... a doua oara


Titlul: Răspuns: 114 Muzeu
Scris de: CHIRILA ADRIAN din Noiembrie 07, 2013, 19:24:13
Da....multumesc de ajutor!


Titlul: Răspuns: 114 Muzeu
Scris de: Mercea Otniel din Februarie 11, 2014, 20:12:48
de ce iau pe aceasta sursa killed by signal 11 si incorect
#include<iostream>
using namespace std;
int a[260][260],i,j,n,inceput=1,sfarsit=1;
int const x1[4]={1,-1,0,0};
int const y1[4]={0,0,1,-1};
char c;
struct pct
{
    int ls,ld,d;
};
pct coada[260],x,y;
#include<stdio.h>
FILE *f,*g;
int main()
{
    f=fopen("muzeu.in","r");
    g=fopen("muzeu.out","w");
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            fscanf(f,"%c",&c);
            if(c=='.')
                a[j]=0;
            else
                if(c=='#')
                a[j]=-2;
            else
                if(c=='P')
                a[j]=-1;
                else
                    if(c=='\n')
                    j--;
        }
       for(i=0;i<=n;i++)
       {
           a
  • =-2;
           a[n+1]=-2;
           a[0]=-2;
           a[n+1]=-2;
       }
       a[n+1][n+1]=-2;
       for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        if(a[j]==-1)
       {coada[inceput].ls=i;
       coada[inceput].ld=j;
       coada[inceput].d=0;
           while(inceput<=sfarsit)
           {
               x=coada[inceput];
               coada[inceput].ls=coada[inceput].ld=coada[inceput].d=0;
               inceput++;
              for(int k=0;k<4;k++)
                if(a[x.ls+x1[k]][x.ld+y1[k]]==0)
                {
                    a[x.ls+x1[k]][x.ld+y1[k]]=x.d+1;
                    y.d=x.d+1;
                    y.ls=x.ls+x1[k];
                    y.ld=x.ld+y1[k];
                    sfarsit++;
                    coada[sfarsit]=y;
                }
                else
                    if(a[x.ls+x1[k]][x.ld+y1[k]]!=0&&a[x.ls+x1[k]][x.ld+y1[k]]!=-1&&a[x.ls+x1[k]][x.ld+y1[k]]!=-2)
                {
                    if(x.d+1<a[x.ls+x1[k]][x.ld+y1[k]])
                    {
                        a[x.ls+x1[k]][x.ld+y1[k]]=x.d+1;
                    y.d=x.d+1;
                    y.ls=x.ls+x1[k];
                    y.ld=x.ld+y1[k];
                    sfarsit++;
                    coada[sfarsit]=y;
                    }
                }

           }

            for(int u=1;u<=sfarsit;u++)
            {
                coada.ls=coada.ld=coada.d=0;
            }
            sfarsit=inceput=1;
       }
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
if(a[j]==0)
fprintf(g,"-1 ");
else
    if(a[j]==-1)
    fprintf(g,"0 ");
else
    fprintf(g,"%d ",a[j]);
fprintf(g,"\n");
}
}


Titlul: Răspuns: 114 Muzeu
Scris de: Mercea Otniel din Februarie 11, 2014, 20:43:18
as putea primi si niste teste ca deja ma dispera problema aceasta?


Titlul: Răspuns: 114 Muzeu
Scris de: Mercea Otniel din Februarie 11, 2014, 20:59:33
rezolvat.era de la spatiul alocat pentru memorie si faptul ca nu retineam toti paznici odata


Titlul: Răspuns: 114 Muzeu
Scris de: Baltaretu Andrei din Februarie 25, 2014, 11:32:49
E foarte simplu ><
In coada adaugi fiecare paznic la inceput dupa care iei fiecare elemnnt din coada si il extinzi.
Va chinuiti foarte mult cu back tracking + ca da tle si cand primesti killed by signal 11 inseamna ca ai declarat ori prea multa memorie ori prea putina nu e grea am 80 de randuri in total  :ok:


Titlul: Răspuns: 114 Muzeu
Scris de: Breahna David din Iunie 21, 2014, 11:19:06
Eu n-am folosit, algoritmul lui Lee,, pentru că am considerat  că găsesc ceva mai eficient..
Dar m-am împotmolit..  nu reușesc să iau decît 80 de puncte.. îmi spune și mie cineva de ce iau doar atît..
Adică unde pierd în timp,, pentru că eu consider că timpii embilor algoritmi ar trebui să fie egali.. ??

http://www.infoarena.ro/job_detail/1199946

Uitați și sursa,, :

http://www.infoarena.ro/job_detail/1199946?action=view-source

Vă rog,, ajutor.. ](*,) ](*,)


Titlul: Răspuns: 114 Muzeu
Scris de: Valentin Valeanu din Iunie 25, 2014, 10:23:31
ce e cu eroarea aceasta ce inseamna  :readthis:Blocked system call: (null).


Titlul: Răspuns: 114 Muzeu
Scris de: Gagea Eusebiu-Andrei din Ianuarie 15, 2016, 13:13:31
Buna ziua! Tot incerc de ceva timp sa fac prblema dar nu reusesc sa iau decat 10 pct. Am pus in coada direct toate pozitiile paznicililor. nu pot sa inteleg ce am gresit. Las si programul meu, in caz ca ma poate ajuta cineva.
Cod:
#include <fstream>
#define NV 4
#define Nmax 62500
using namespace std;
ifstream fin("muzeu.in");
ofstream fout("muzeu.out");
int a[252][252],n,k,p,u;
struct Pct{int x,y;};
Pct c[Nmax];
int dx[NV] = {-1,0,1,0};
int dy[NV] = {0,1,0,-1};

void citire();
void Lee();
void afisare();

int main()
{
    citire();
    Lee();
    afisare();
    return 0;
}

void citire()
{
    int i,j;
    char sir[252];
    fin>>n;
    fin.get();
    for(i=1; i<=n; i++)
    {
        fin.getline(sir,252);
        for(j=1; j<=n; j++)
        {
            if(sir[j-1]=='.')
                a[i][j]=-1;
            else if(sir[j-1]=='#')
                a[i][j]=-2;
            else
            {
                a[i][j]=0;
                c[u].x=i;
                c[u++].y=j;
            }
        }
    }
}

void Lee()
{
    Pct B,C;
    u--;
    int i;
    while(p<=u)
    {
        B.x=c[p].x;
        B.y=c[p].y;
        p++;
        for(i=0; i<NV; i++)
        {
            C.x=B.x+dx[i];
            C.y=B.y+dy[i];
            if(a[C.x][C.y]==-1)
            {
                a[C.x][C.y]=a[B.x][B.y]+1;
                u++;
                c[u].x=C.x;
                c[u].y=C.y;

            }
        }
    }
}

void afisare()
{
    int i,j;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
            if(a[i][j]<0)
                fout<<a[i][j]<<" ";
            else
                fout<<" "<<a[i][j]<<" ";
        fout<<"\n";
    }
}


Editat de moderator: Încearcă să foloseşti tag-ul [code ] [ /code] atunci când vrei să inserezi fragmente din surse.


Titlul: Răspuns: 114 Muzeu
Scris de: Radu Toporan din Martie 07, 2016, 15:00:45
Solutia de 100p folosind algoritmul lui Lee:

#include <cstdio>

int i,j,n,sc,a[255][255];
int dx[]={0, 1, 0, -1};
int dy[]={1, 0, -1, 0};
struct coada
{
    int l,c;
};
coada c[66000];

void citire()
{
    int i,j;
    char s[255];
    freopen("muzeu.in","r",stdin);
    freopen("muzeu.out","w",stdout);
    scanf("%d",&n);
    sc=0;
    for (i=1; i<=n; i++)
    {
        scanf("%s",&s);
        for (j=0; j<=n-1; j++)
            if (s[j]=='#') a[j+1]=-1;
                else if (s[j]=='P')
                {
                    a[j+1]=1;
                    sc++;
                    c[sc].l=i;
                    c[sc].c=j+1;
                }
    }
}

void bordare()
{
    int i;
    for (i=0; i<=n+1; i++)
    {
        a
  • =-1;
        a[n+1]=-1;
        a[0]=-1;
        a[n+1]=-1;
    }
}

void Lee()
{
    int i,ic=1;
    coada t,cx;
    while (ic<=sc)
    {
        t=c[ic];
        ic++;
        for (i=0; i<=3; i++)
        {
            cx.l=t.l+dx;
            cx.c=t.c+dy;
            if (a[cx.l][cx.c]==0)
            {
                sc++;
                c[sc].l=cx.l;
                c[sc].c=cx.c;
                a[cx.l][cx.c]=a[t.l][t.c]+1;
            }
        }
    }
}

void afisare()
{
    int i,j;
   for (i=1; i<=n; i++)
    {
        for (j=1; j<=n; j++)
            printf("%d ",a[j]-1);
        printf("\n");
    }
}

int main()
{
    citire();
    bordare();
    Lee();
    afisare();
    return 0;
}


Titlul: Răspuns: 114 Muzeu
Scris de: Preoteasa Mircea-Costin din Martie 02, 2017, 20:26:04
de ce e sursa goala si de ce merge


Titlul: Răspuns: 114 Muzeu
Scris de: Craciun Adrian din Aprilie 04, 2017, 20:52:02
#include <fstream>
#include <climits>
#include <iomanip>
#include <queue>
using namespace std;

ifstream fin("muzeu.in");
ofstream fout("muzeu.out");

const int di[] = {-1, 0, 1, 0};
const int dj[] = {0, 1, 0, -1};

char a[250][250];
int c[250][250];
int n;
queue< pair <int, int> > Q;
int Ok (int I, int J);

int main()
{
    fin >> n;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            {
                fin >> a[j];
                if (a[j] == 'P')
                    {
                        c[j] = 1;
                    }
            }


    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (c[j] == 0)
                c[j] = INT_MAX;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (c[j] == 1)
                {
                    c[j] = 0;
                    Q.push({i, j});
                }

    int i, j, iv, jv;

    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();

        for (int d = 1; d <= 4; d++)
        {
            iv = i + di[d];
            jv = j + dj[d];
            if (Ok(iv, jv) && c[iv][jv] > c[j] + 1)
            {
                c[iv][jv] = c[j] + 1;
                Q.push({iv, jv});
            }
        }
    }
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                if (c[j] == INT_MAX)
                    c[j] = -1;

        for (int i = 1; i <= n; ++i, fout << endl)
            for (int j = 1; j <= n; ++j)
                fout << c[j] << ' ';


}

int Ok(int I, int J)
{
    if (I > n || J > n || I < 1 || J < 1)
        return false;
    if (a[J] == '#')
        return false;

    return true;
}
 ce nu e bine?


Titlul: Răspuns: 114 Muzeu
Scris de: Balanici Andrei Daniel din Ianuarie 21, 2018, 20:07:44
Ma poate ajuta cineva!Am folosit Lee,dar mai mult de 30 puncte nu obtin deoarece raspunsul e incorect.


#include <fstream>
#include <queue>
#include <iostream>
using namespace std;
ifstream f("muzeu.in");
ofstream g("muzeu.out");
int OK();
int  n,k=0,dl[]={0,1,-1,0,0},dc[]={0,0,0,1,-1},M[251][251],x,y,x1,y1;
char litera;

queue <pair <int,int> > Q;
pair <int,int> P[251];
void Citire()
{
    f>>n; f.get();
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
    {
        f.get(litera);
        if(litera=='P') { Q.push(make_pair(i+1,j+1)); k++; }
        else
            if(litera=='#') M[i+1][j+1]=-2;
        if(j==n-1) {f.get(); }
    }

}

void Lee()
{  int l=0;
    while(!Q.empty())
    {
        x=Q.front().first;
        y=Q.front().second; l++;
        Q.pop();
        for(int i=1;i<=4;i++)
        {
            x1=x+dl;
            y1=y+dc;
            if(OK()!=0&&M
  • [y]!=-3)
            {
                M[x1][y1]=M
  • [y]+1;
                Q.push(make_pair(x1,y1));
            }
        }
        if(l<=k) M
  • [y]=-3;
    }
}

int OK()
{
    if(M[x1][y1]!=0&&(x1>=1&&y1>=1&&x1<=n&&y1<=n)&&M[x1][y1]!=-2&&M
  • [y]+1<M[x1][y1])
        return 1;
     if(M[x1][y1]==0&&(x1>=1&&y1>=1&&x1<=n&&y1<=n))
        return 1;
        return 0;
}

int main()
{
    Citire();
    Lee();
       for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
         {
             if(M[j]==0) M[j]=-1;
             if(M[j]==-3) M[j]=0;
             if(j<n) g<<M[j]<<" ";
             if(j==n) {  g<<M[j]; g<<'\n';  }
         }
    return 0;
}


Titlul: Răspuns: 114 Muzeu
Scris de: Balanici Andrei Daniel din Ianuarie 21, 2018, 20:08:26
Ma poate ajuta cineva!Am folosit Lee,dar mai mult de 30 puncte nu obtin deoarece raspunsul e incorect.


#include <fstream>
#include <queue>
#include <iostream>
using namespace std;
ifstream f("muzeu.in");
ofstream g("muzeu.out");
int OK();
int  n,k=0,dl[]={0,1,-1,0,0},dc[]={0,0,0,1,-1},M[251][251],x,y,x1,y1;
char litera;

queue <pair <int,int> > Q;
pair <int,int> P[251];
void Citire()
{
    f>>n; f.get();
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
    {
        f.get(litera);
        if(litera=='P') { Q.push(make_pair(i+1,j+1)); k++; }
        else
            if(litera=='#') M[i+1][j+1]=-2;
        if(j==n-1) {f.get(); }
    }

}

void Lee()
{  int l=0;
    while(!Q.empty())
    {
        x=Q.front().first;
        y=Q.front().second; l++;
        Q.pop();
        for(int i=1;i<=4;i++)
        {
            x1=x+dl;
            y1=y+dc;
            if(OK()!=0&&M
  • [y]!=-3)
            {
                M[x1][y1]=M
  • [y]+1;
                Q.push(make_pair(x1,y1));
            }
        }
        if(l<=k) M
  • [y]=-3;
    }
}

int OK()
{
    if(M[x1][y1]!=0&&(x1>=1&&y1>=1&&x1<=n&&y1<=n)&&M[x1][y1]!=-2&&M
  • [y]+1<M[x1][y1])
        return 1;
     if(M[x1][y1]==0&&(x1>=1&&y1>=1&&x1<=n&&y1<=n))
        return 1;
        return 0;
}

int main()
{
    Citire();
    Lee();
       for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
         {
             if(M[j]==0) M[j]=-1;
             if(M[j]==-3) M[j]=0;
             if(j<n) g<<M[j]<<" ";
             if(j==n) {  g<<M[j]; g<<'\n';  }
         }
    return 0;
}