Sunteți pe pagina 1din 4

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII AL REPUBLICII MOLDOVA

IP CENTRUL DE EXCELENȚĂ ÎN INFORMATICĂ ȘI TEHNOLOGII INFORMAȚIONALE

DISCIPLINA

UTILIZAREA TEHNICILOR CLASICE DE PROGRAMARE

LUCRAREA DE LABORATOR NR.3

ALGORITMUL LUI LEE

Specialitatea: Programare și analiza produselor program

Elev: Budurin Denis, grupa P-1833

Profesor: Dascal Andrian

Chișinău, 2019
Sarcini rezolvate
Problema ursi
O rezervație de urși panda, privită de sus, are formă dreptunghiulară și este compusă
din n rânduri identice, iar pe fiecare rând sunt m țarcuri identice cu baza pătrată. Țarcurile sunt
îngrădite și sunt prevăzute cu uși către toate cele 4 țarcuri vecine. Ușile sunt prevăzute cu câte
un cod de acces, ca atare acestea se închid și se deschid automat. Prin acest sistem, unele ţarcuri
sunt accesibile ursuleților, iar altele le sunt interzise acestora. În T țarcuri se găsește mâncare
pentru ursuleți.

Ursuleții din rezervație poartă câte un microcip care le deschide automat ușile țarcurilor unde
pot intra și închide automat uşile țarcurilor interzise. Un țarc este accesibil ursulețului dacă
ultimele S cifre ale reprezentărilor binare ale codului țarcului și ale codului k de pe microcip
sunt complementare. (Exemplu: pentru S=8, 11101011 și 00010100 sunt complementare).

Într-un țarc este un ursuleț căruia i s-a făcut foame. Ursulețul se deplasează doar paralel cu
laturile dreptunghiului. Trecerea dintr-un țarc în altul vecin cu el se face într-o secundă

Rezolva re:
#include<fstream>
#include<iostream>
#define Nmax 500
using namespace std;
ifstream in("panda.in");
ofstream out("panda.out");
int a[Nmax+2][Nmax+2],b[Nmax+2][Nmax+2];
int n,m,kod,t,l,c,r,d_min=320000,imin,p,s;
struct tarc{unsigned l,c;};
tarc coada[Nmax*Nmax],papa[Nmax*Nmax];
void citire()
{int i,j,x,y;
in>>p;
in>>n>>m>>t>>l>>c>>kod>>s;
for(i=1;i<=t;i++)
{in>>papa[i].l>>papa[i].c;}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
in>>a[i][j];
in.close();
}
void lee(int l,int c)
{
int st=1,dr=1,ll,cc,pas;
ll=l;
cc=c;
b[ll][cc]=10;
coada[dr].l=l;
coada[dr].c=c;
while(st<=dr)
{
ll=coada[st].l;
cc=coada[st].c;
pas=b[ll][cc];
if(ll-1>0&&(b[ll-1][cc]==0||b[ll-1][cc]>pas+1))
{b[ll-1][cc]=pas+1;
dr++;
coada[dr].l=ll-1;
coada[dr].c=cc;
}
if(ll+1<=n&&(b[ll+1][cc]==0||b[ll+1][cc]>pas+1))
{b[ll+1][cc]=pas+1;
dr++;
coada[dr].l=ll+1;
coada[dr].c=cc;
}
if(cc-1>0&&(b[ll][cc-1]==0||b[ll][cc-1]>pas+1))
{b[ll][cc-1]=pas+1;
dr++;
coada[dr].l=ll;
coada[dr].c=cc-1;
}
if(cc+1<=m&&(b[ll][cc+1]==0||b[ll][cc+1]>pas+1))
{b[ll][cc+1]=pas+1;
dr++;
coada[dr].l=ll;
coada[dr].c=cc+1;
}
st++;
}
}
void construire()
{int i,j,putere2=1;
for(i=1;i<=s;i++)
putere2*=2;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{if((((a[i][j]%putere2)^(kod%putere2))&(putere2-1))==putere2-1)
b[i][j]=0;
else b[i][j]=-1;
}
}
int main()
{
int i,j,nt=0,nrt=0;
citire();
construire();
if(p==1)
{ for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(b[i][j]==0)
nrt++;
cout<<b[l][c];
out<<nrt-1<<'\n';
}
else
{
b[l][c]=10;
lee(l,c);
for (i=1;i<=t;i++)
if(b[papa[i].l][papa[i].c]>1&&b[papa[i].l][papa[i].c]<d_min)
{d_min=b[papa[i].l][papa[i].c];
}
for(i=1;i<=t;i++)
if(b[papa[i].l][papa[i].c]==d_min)
{nt++;
}
out<<d_min-10<<' '<<nt<<'\n';
}
out.close();
}

EXEMPLUL 1

panda.in

1
5 6 4
3 5 1 1
1 2
5 1
2 1
4 3
15 1278 3 1278 1278 1
16 17 18 19 254 20
21 25 26 254 254 254
27 28 29 3 2 254
2 254 4 254 254 254
panda.out

S-ar putea să vă placă și