Afişează mesaje
Pagini: [1]
1  infoarena - concursuri, probleme, evaluator, articole / Concursuri / inginer/problema de la .campion : Martie 29, 2014, 17:58:15
Știe cineva o rezolvare mai eficientă a problemei Inginer. Eu ma incercat așa(folosinf algoritmul lui Lee):
#include<fstream>
using namespace std;
 
ifstream f("inginer.in");
ofstream g("inginer.out");
 
struct Pozitie{int lin,col;};
 
void lee(int n,int m,int l[78][78],int stx,int sty,int spx, int spy)
{
struct Pozitie C[n*m];
 
Pozitie ps,pc,p,v;
 
int i;
 
//Bordura cu 0
for(i=0; i<=m; i++)
    l[0] = 0,l[n+1] = 0;
for(i=0; i<=n; i++)
    l
  • = 0,l[m+1] = 0;

ps.lin = stx; // Poz de start
ps.col = sty;
 
pc.lin = spx; // Poz de final
pc.col = spy;
 
int prim=0,ultim=0;
l[ps.lin][ps.col] = 1; // Marcam pozitia de start si de final
l[pc.lin][pc.col] = 0;
 
int dc[]={0,1,0,-1};
int dl[]={-1,0,1,0};
 
int dist=0;
 
C[0] = ps; // Pozitia de start
while(prim <= ultim && l[pc.lin][pc.col] == 0)
      {
       dist++;
       p = C[prim]; prim++;
       for(i=0; i<4; i++)
           {
            v.lin = p.lin + dl;
            v.col = p.col + dc;
            if(v.lin >= 1 && v.lin <= n+1 && v.col >= 1 && v.col<=m+1)
            if(l[v.lin][v.col] == 0)
               {
                l[v.lin][v.col] = dist;
                ultim++;
                C[ultim] = v;
               }
           }
      }
 
if(l[pc.lin][pc.col] == 0) g<<"0\n";
else g<<dist<<"\n";
}
 
int main()
{
int i,j,n,m,l[78][78];
char x;
int x1,y1,x2,y2;
 
f>>n>>m;
 
for(i=1; i<=n; i++)
    for(j=1; j<=m; j++)
        {
         f>>x;
         if(x == 'X') l[j] = -1; // zid
         else l[j] = 0; //culoar
        }
 
do{
    f>>x1;
    f>>y1;
    f>>x2;
    f>>y2;
 
    if(x1 != 0 && x2 != 0 && y1 != 0 && y2 != 0)
      lee(n,m,l,x1,y1,x2,y2);
  }
while(x1 != 0 && x2 != 0 && y1 != 0 && y2 != 0);
 
f.close();
g.close();
return 0;
}
Pagini: [1]
Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines