#4806
Andrei se află într-un labirint format dintr-o matrice de camere, fiecare având unul dintre următoarele tipuri: 0: cameră cu bec stins, 1: cameră cu bec aprins, 2: cameră fără bec (inaccesibilă), 3: cameră cu întrerupător.
Camerele de tip 3 pot aprinde/stinge becurile altor camere. Andrei poate alege să apese sau nu întrerupătoarele întâlnite. El pornește dintr-o cameră dată și trebuie să ajungă într-o cameră destinație, deplasându-se doar prin camere aprinse.
Se cere determinarea distanței minime pentru a ajunge la destinație.
Concursul Național de Matematică și Informatică Grigore Moisil
| Problema | EscapeLight | Operații I/O |
escapelight.in/escapelight.out
|
|---|---|---|---|
| Limita timp | 0.7 secunde | Limita memorie |
Total: 64 MB
/
Stivă 8 MB
|
| Id soluție | #63616013 | Utilizator | |
| Fișier | escapelight.c | Dimensiune | 1.67 KB |
| Data încărcării | 11 Martie 2026, 13:23 | Scor/rezultat | 79 puncte |
escapelight.c: In function 'main': escapelight.c:7:433: warning: variable 'pp' set but not used [-Wunused-but-set-variable] typedef struct{FILE*f;int p,n;char b[B];}I;static int g[C],a[C],sid[C],deg[C],nb[C][4],par[S];static int gc(I*s){if(s->p>=s->n){s->n=fread(s->b,1,B,s->f);s->p=0;if(!s->n)return EOF;}return s->b[s->p++];}static int gi(I*s){int c,x=0;do c=gc(s);while(c<=32&&c!=EOF);while(c>32)x=x*10+c-48,c=gc(s);return x;}int main(void){FILE*in=fopen("escapelight.in","rb"),*out=fopen("escapelight.out","w");I s;int n,m,ms,p=0,i,j,u,v,xs,ys,xf,yf,k,pp,st,go,tot,sz,h=0,t=0,z,mk,c,cd,sw,nz,*dist,*dq;if(!in||!out)return 0;s.f=in;s.p=s.n=0;n=gi(&s);m=gi(&s);ms=n*m;for(i=1;i<S;i++)par[i]=par[i>>1]^(i&1);for(i=0;i<ms;i++)sid[i]=-1;for(i=0;i<n;i++)for(j=0;j<m;j++)g[u=i*m+j]=gi(&s),g[u]==3&&(sid[u]=p++,-1);for(i=0;i<n;i++)for(j=0;j<m;j++){u=i*m+j;if(i)nb[u][deg[u]++]=u-m;if(i+1<n)nb[u][deg[u]++]=u+m;if(j)nb[u][deg[u]++]=u-1;if(j+1<m)nb[u][deg[u]++]=u+1;}xs=gi(&s);ys=gi(&s);xf=gi(&s);yf=gi(&s);st=(xs-1)*m+ys-1;go=(xf-1)*m+yf-1;k=gi(&s);pp=gi(&s);for(i=0;i<k;i++){int xw=gi(&s),yw=gi(&s),xl=gi(&s),yl=gi(&s);a[(xl-1)*m+yl-1]|=1<<sid[(xw-1)*m+yw-1];}tot=ms<<p;sz=tot+1;dist=malloc((size_t)tot*4);dq=malloc((size_t)sz*4);if(!dist||!dq){free(dist);free(dq);return 0;}memset(dist,255,(size_t)tot*4);dist[st]=0;dq[t++]=st;while(h!=t){z=dq[h];if(++h==sz)h=0;mk=z/ms;c=z-mk*ms;cd=dist[z];if(c==go){fprintf(out,"%d\n",cd+1);return 0;}if((sw=sid[c])!=-1){nz=((mk^(1<<sw))*ms)+c;if(dist[nz]==-1||dist[nz]>cd){dist[nz]=cd;if(--h<0)h=sz-1;dq[h]=nz;}}for(i=0;i<deg[c];i++)if((v=nb[c][i],g[v]!=2&&(g[v]==3||(g[v]^par[mk&a[v]])))){nz=mk*ms+v;if(dist[nz]==-1||dist[nz]>cd+1){dist[nz]=cd+1;dq[t]=nz;if(++t==sz)t=0;}}}return 0;} ^
| Test | Timp | Mesaj evaluare | Scor posibil | Scor obținut | ||
|---|---|---|---|---|---|---|
| 0 | 0 secunde | OK. | 5 | 5 | ||
| 1 | 0 secunde | OK. | 5 | 5 | ||
| 2 | 0 secunde | OK. | 5 | 5 | ||
| 3 | 0 secunde | OK. | 5 | 5 | ||
| 4 | 0 secunde | OK. | 5 | 5 | ||
| 5 | 0 secunde | OK. | 5 | 5 | ||
| 6 | 0 secunde | OK. | 3 | 3 | ||
| 7 | 0 secunde | OK. | 4 | 4 | ||
| 8 | 0 secunde | OK. | 3 | 3 | ||
| 9 | 0 secunde | OK. | 5 | 5 | ||
| 10 | 0 secunde | OK. | 2 | 2 | ||
| 11 | 0 secunde | OK. | 3 | 3 | ||
| 12 | 0 secunde | OK. | 4 | 4 | ||
| 13 | 0 secunde | OK. | 2 | 2 | ||
| 14 | 0 secunde | Raspuns gresit. | 3 | 0 | ||
| 15 | 0 secunde | Raspuns gresit. | 4 | 0 | ||
| 16 | 0.008 secunde | OK. | 2 | 2 | ||
| 17 | 0.016 secunde | OK. | 3 | 3 | ||
| 18 | 0.024 secunde | OK. | 4 | 4 | ||
| 19 | 0.024 secunde | OK. | 2 | 2 | ||
| 20 | 0.02 secunde | OK. | 3 | 3 | ||
| 21 | 0.068 secunde | OK. | 4 | 4 | ||
| 22 | 0.084 secunde | OK. | 2 | 2 | ||
| 23 | 0.064 secunde | OK. | 3 | 3 | ||
| 24 | 0 secunde | Raspuns gresit. | 4 | 0 | ||
| 25 | 0 secunde | Raspuns gresit. | 3 | 0 | ||
| 26 | 0 secunde | Raspuns gresit. | 3 | 0 | ||
| 27 | 0 secunde | Raspuns gresit. | 4 | 0 | ||
| Punctaj total | 79 | |||||
www.pbinfo.ro permite evaluarea a două tipuri de probleme:
Problema EscapeLight face parte din prima categorie. Soluția propusă de tine va fi evaluată astfel:
Suma punctajelor acordate pe testele utilizate pentru verificare este 100. Astfel, soluția ta poate obține cel mult 100 de puncte, caz în care se poate considera corectă.