Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 1215 Pescari  (Citit de 2566 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« : Octombrie 17, 2011, 16:00:56 »

Aici puteţi discuta despre problema Pescari.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
darkseeker
De-al casei
***

Karma: 29
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #1 : Octombrie 17, 2011, 21:29:01 »

Complexitatea ceruta e O(N * M) ?
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #2 : Octombrie 17, 2011, 23:03:22 »

Complexitatea ceruta e O(N * M) ?
Da.

Cu ce ne ajuta acel P ? Smile
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #3 : Octombrie 18, 2011, 12:53:34 »

Nu prea ajuta P.
Memorat
darkseeker
De-al casei
***

Karma: 29
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #4 : Octombrie 18, 2011, 18:31:28 »

Daca se poate face N * M cu lee va rog frumos lasati-mi un hint ... Eu am facut 100 cu o dinamica dar fol 20mb memorie pe testul maxim . Multumesc anticipat .
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #5 : Octombrie 18, 2011, 18:35:22 »

Ideea ta de dinamica e interesanta, si ruleaza destul de repede Smile
Ca sa faci cu Lee poti introduce in coada toate terenurile acoperite cu apa, si vezi care e distanta minima de la acele terenuri la oricare alt punct de pe harta. Ideea e sa faci un singur Lee.
Memorat
darkseeker
De-al casei
***

Karma: 29
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #6 : Octombrie 18, 2011, 18:39:17 »

Pai asta nu ar fi similar cu a face lee din fiecare teren acoperit cu apa ? Sau le introduc in coada pe toate din prima ? Daca le introduc din prima in coada pe toate nu ar trebui sa vizitez fiecare celula din matrice kte odata pt fiekre punct din coada ca sa asigur optimalitatea distantelor sau distanta ramane optima si daca vizitez fiecare patrat doar pentru primul drum care il contine ?
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #7 : Octombrie 18, 2011, 18:46:17 »

Daca le introduci pe toate din prima, vei verifica prima data vecinii acestor puncte care nu sunt terenuri acoperite cu apa si vei introduce in coada puncte cu distante = 1. Cand vei ajunge sa procesezi aceste puncte, nu mai are rost sa verifici punctele bagate deja in coada pentru ca ai calculate deja distantele pentru ele, deci va urma sa adaugi punctele de la distanta 2, s.a.m.d pana bagi toate punctele in coada.

Poti observa ca un punct intra o singura data in coada din cauza ordinii in care le pargurgi. Nu se va intampla sa ajungi la un punct cu distanta X, sa'l bagi in coada, apoi sa ajungi la alt punct cu distanta Y (Y < X) pe care sa'l adaugi in coada, iar al doilea punct sa te determine sa recalculezi distanta primului punct.
Memorat
scipianus
Nu mai tace
*****

Karma: 129
Deconectat Deconectat

Mesaje: 345



Vezi Profilul
« Răspunde #8 : Octombrie 18, 2011, 18:57:27 »

Daca le introduci pe toate din prima, vei verifica prima data vecinii acestor puncte care nu sunt terenuri acoperite cu apa si vei introduce in coada puncte cu distante = 1. Cand vei ajunge sa procesezi aceste puncte, nu mai are rost sa verifici punctele bagate deja in coada pentru ca ai calculate deja distantele pentru ele, deci va urma sa adaugi punctele de la distanta 2, s.a.m.d pana bagi toate punctele in coada.

Poti observa ca un punct intra o singura data in coada din cauza ordinii in care le pargurgi. Nu se va intampla sa ajungi la un punct cu distanta X, sa'l bagi in coada, apoi sa ajungi la alt punct cu distanta Y (Y < X) pe care sa'l adaugi in coada, iar al doilea punct sa te determine sa recalculezi distanta primului punct.

Asta din cauza ca distanta dintre oricare 2 celule vecine e 1 si deci este exact la fel ca la un BFS folosit pe un graf neorientat fara costuri pe muchii pentru a afla distanta(costul) minima. Daca ar fi fost distanta dintre 2 campuri vecine variabila,in functie de vreun numar continut de acel camp din matrice,atunci ar fi fost de ajutor ca optimizarea folosirea unei cozi de prioritati (sortata dupa distante minime),in loc de coada obisnuita  Thumb up
Memorat
maritim
Vorbaret
****

Karma: 59
Deconectat Deconectat

Mesaje: 176



Vezi Profilul
« Răspunde #9 : Octombrie 18, 2011, 19:29:55 »

Ca sa intelegi mai bine cum merge Lee-ul cu toate elementele introduse de la inceput in coada incearca sa faci problema Muzeu Very Happy .
Memorat
darkseeker
De-al casei
***

Karma: 29
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #10 : Octombrie 19, 2011, 19:32:38 »

Va multumesc la toti 3 pentru raspunsurile voastre . Am inteles acum de ce merge corect ideea de a baga toate terenurile in coada de la inceput Very Happy .
Memorat
tzipleatud
De-al casei
***

Karma: 104
Deconectat Deconectat

Mesaje: 117



Vezi Profilul
« Răspunde #11 : Octombrie 20, 2011, 18:01:10 »

Salut! Am implementat solutia cu algoritmul lui Lee,am pus de la inceput in coada dar iau 90 de puncte,pe testul 7 imi dai Incorect  Brick wall .Stau de nu stiu cat timp dar nu imi dau seama care este problema. O fi vreun caz special?
Memorat
lsorin_94
Strain


Karma: -8
Deconectat Deconectat

Mesaje: 23



Vezi Profilul
« Răspunde #12 : Octombrie 23, 2011, 11:36:39 »

pot sa fie 2 pescari pe acceasi balta ?
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #13 : Octombrie 23, 2011, 11:49:30 »

Dupa cum zice si in enunt, adica sa aflam drumul minim al fiecarui pescar pana la cea mai apropiata balta, atunci merge oricati pescari pe aceeasi balta  Ok.
Memorat
TheNechiz
De-al casei
***

Karma: 30
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #14 : Ianuarie 03, 2013, 16:58:36 »

Am luat 40p. Fool
Huh
« Ultima modificare: Ianuarie 05, 2013, 19:50:14 de către Birisan Razvan » Memorat
paunmatei7
Strain
*

Karma: 28
Deconectat Deconectat

Mesaje: 27



Vezi Profilul
« Răspunde #15 : Ianuarie 05, 2013, 00:43:13 »

vezi ca dimensiunile matricei nu trebuie sa fie exacte pune 1001
si incearca sa mai reduci prin program fara sa pui atatea if-uri
faci 2 vectori de coordonare dx si dy cu cele 8 sau 4 directii ( adica daca mergi in nord pui dx [ 1 ] = -1 si dy [ i ] = 0 ) si faci un for in care verifici daca lin + dx [ i ] si col + dy [ i ] Smile dar trebuie sa pui toate conditiile alea cu n>lin >0 si n>col >0 etc ..
Sper sa te ajute Very Happy
Memorat
TheNechiz
De-al casei
***

Karma: 30
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #16 : Ianuarie 05, 2013, 19:49:08 »

O să scriu codul din nou...
Mersi pentru sfaturi. Smile
Memorat
CosminRusu
De-al casei
***

Karma: 77
Deconectat Deconectat

Mesaje: 104



Vezi Profilul
« Răspunde #17 : Februarie 10, 2013, 16:31:00 »

Cod:
#include<fstream>
#include<iostream>
using namespace std;

int a[1005][1005],i,j,ok,u,p,P,q[3][10005],c,d,y,m,sir[3][10005],maxi,l[1005][1005],n,k=0;
ifstream fin("pescari.in");
ofstream g("pescari.out");

void init()

{

     //citim datele din fisierul pescari.in
     fin>>n>>m>>P;
   //  cout<<n;
      for(i=1;i<=n;i++)
             for(j=1;j<=m;j++)
            { fin>>a[i][j];
              l[i][j]=0;
              if(a[i][j]==2) {l[i][j]=0;k++;sir[1][k]=i;sir[2][k]=j;}
            }
             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, y;
     p=0;u=0;
     p=0;
     u=k;
     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]==0 || a[x-1][y]==1)
       if((l[x-1][y]>l[x][y]+1||l[x-1][y]==0))
       {
                                       l[x-1][y]=l[x][y]+1;
       intr(x-1,y);

      }

     //
      if(x<n)
       if(a[x+1][y]==0 || a[x+1][y]==1)
        if(l[x+1][y]>l[x][y]+1||l[x+1][y]==0)
        {l[x+1][y]=l[x][y]+1;
         intr(x+1,y);

         }

    if(y>1)
     if(a[x][y-1]==0 || a[x][y-1]==1)
           if(l[x][y-1]>l[x][y]+1 || l[x][y-1]==0)
           {l[x][y-1]=l[x][y]+1;
                                  intr(x,y-1);

                                  }
    if(y<m)
     if(a[x][y+1]==0 || a[x][y+1]==1)
      if(l[x][y+1]>l[x][y]+1||l[x][y+1]==0)
    {l[x][y+1]=l[x][y]+1;
    intr(x,y+1);

    }
    if(y<m && x<n)
     if(a[x+1][y+1]==0 || a[x+1][y+1]==1)
      if(l[x+1][y+1]>l[x][y]+1||l[x+1][y+1]==0)
    {l[x+1][y+1]=l[x][y]+1;
    intr(x+1,y+1);}


    if(y>1 && x<n)
     if(a[x+1][y-1]==0 || a[x+1][y-1]==1)
      if(l[x+1][y-1]>l[x][y]+1||l[x+1][y-1]==0)
    {l[x+1][y-1]=l[x][y]+1;
    intr(x+1,y-1);}


    if(y<m && x>1)
     if(a[x-1][y+1]==0 || a[x-1][y+1]==1)
      if(l[x-1][y+1]>l[x][y]+1||l[x-1][y+1]==0)
    {l[x-1][y+1]=l[x][y]+1;
    intr(x-1,y+1);}


    if(y>1 && x>1)
     if(a[x-1][y-1]==0 || a[x-1][y-1]==1)
      if(l[x-1][y-1]>l[x][y]+1||l[x-1][y-1]==0)
    {l[x-1][y-1]=l[x][y]+1;
    intr(x-1,y-1);

    }

}

}
void scriere()
{

      for(i=1;i<=n;i++)
                       for(j=1;j<=m;j++)
                                        if(a[i][j]==1)
                                           g<<l[i][j]<<"\n";
}
int main()
{

    init();
    for(i=1;i<=k;i++) {
        q[1][i]=sir[1][i];
        q[2][i]=sir[2][i];
    }
    lee();
     scriere();

    return 0;
}
Sursa mea ia 50 de puncte. Pe restul testelor avand Incorect. As ramane profund indatorat daca cineva mi-ar explica unde si de ce gresesc Smile. Numai bine  peacefingers!
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines