Documente Academic
Documente Profesional
Documente Cultură
DISCIPLINA
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