#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 | #63615773 | Utilizator | |
| Fișier | escapelight.c | Dimensiune | 2.29 KB |
| Data încărcării | 11 Martie 2026, 13:18 | Scor/rezultat | 70 puncte |
escapelight.c: In function 'main': escapelight.c:9:1196: warning: ignoring return value of 'fscanf', declared with attribute warn_unused_result [-Wunused-result] typedef unsigned short us;static int n,m,g[C],a[C],sid[C],ip[C],pos[U],si[U],vis[C],q[C],ds[C],d[S][U][U],dist[S][U],hn,hv[H],hp[H],dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},p,uc,st,go,tim;static void up(int v,int c){int i=++hn,j;for(hv[i]=v,hp[i]=c;i>1&&hp[j=i>>1]>c;i=j)hv[i]=hv[j],hp[i]=hp[j];hv[i]=v;hp[i]=c;}static int pop(int*c){int r=hv[1],v=hv[hn],x=hp[hn--],i=1,j;*c=hp[1];while((j=i<<1)<=hn){if(j<hn&&hp[j+1]<hp[j])j++;if(hp[j]>=x)break;hv[i]=hv[j];hp[i]=hp[j];i=j;}hv[i]=v;hp[i]=x;return r;}static int ok(int x,int mk){return g[x]==2?0:g[x]==3?1:(g[x]^__builtin_parity((unsigned)(mk&a[x])));}static void bfs(int mk,int s){int i,j,l=0,r=0,u=pos[s],need=uc,x,y,nx,ny,v;for(i=0;i<uc;i++)d[mk][s][i]=INF;if(!ok(u,mk))return;vis[u]=++tim;ds[u]=0;q[r++]=u;d[mk][s][s]=0;need--;while(l<r&&need){x=q[l++];y=x%m;for(i=0;i<4;i++){nx=x/m+dx[i];ny=y+dy[i];if(nx<0||nx>=n||ny<0||ny>=m)continue;v=nx*m+ny;if(vis[v]==tim||!ok(v,mk))continue;vis[v]=tim;ds[v]=ds[x]+1;q[r++]=v;if((j=ip[v])!=-1&&d[mk][s][j]==INF)d[mk][s][j]=ds[v],need--;}}}int main(void){FILE*in=fopen("escapelight.in","r"),*out=fopen("escapelight.out","w");int i,j,k,pp,xs,ys,xf,yf,ms,mk,cur,cst,cm,ci,sw,nm,ni,v;if(!in||!out)return 0;fscanf(in,"%d%d",&n,&m);ms=n*m;for(i=0;i<ms;i++)sid[i]=ip[i]=-1;for(i=0;i<n;i++)for(j=0;j<m;j++){fscanf(in,"%d",&g[i*m+j]);if(g[i*m+j]==3)sid[i*m+j]=p++;}fscanf(in,"%d%d%d%d",&xs,&ys,&xf,&yf);st=(xs-1)*m+ys-1;go=(xf-1)*m+yf-1;fscanf(in,"%d%d",&k,&pp);for(i=0;i<k;i++){int xsw,ysw,xl,yl,s,l;fscanf(in,"%d%d%d%d",&xsw,&ysw,&xl,&yl);s=(xsw-1)*m+ysw-1;l=(xl-1)*m+yl-1;a[l]|=1<<sid[s];}for(i=0;i<ms;i++)if(sid[i]!=-1)ip[i]=uc,pos[uc]=i,si[uc]=sid[i],uc++;if(ip[st]==-1)ip[st]=uc,pos[uc]=st,si[uc++]=-1;if(ip[go]==-1)ip[go]=uc,pos[uc]=go,si[uc++]=-1;for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)bfs(mk,i);for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)dist[mk][i]=1e9;hn=0;dist[0][ip[st]]=0;up(ip[st],0);while(hn){cur=pop(&cst);cm=cur/uc;ci=cur%uc;if(cst!=dist[cm][ci])continue;if(ci==ip[go]){fprintf(out,"%d\n",cst+1);return 0;}if((sw=si[ci])!=-1&&(cst<dist[nm=cm^(1<<sw)][ci]))dist[nm][ci]=cst,up(nm*uc+ci,cst);for(i=0;i<uc;i++)if(i!=ci&&(v=d[cm][ci][i])<INF&&(ni=cst+v)<dist[cm][i])dist[cm][i]=ni,up(cm*uc+i,ni);}return 0;} ^ escapelight.c:9:1293: warning: ignoring return value of 'fscanf', declared with attribute warn_unused_result [-Wunused-result] typedef unsigned short us;static int n,m,g[C],a[C],sid[C],ip[C],pos[U],si[U],vis[C],q[C],ds[C],d[S][U][U],dist[S][U],hn,hv[H],hp[H],dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},p,uc,st,go,tim;static void up(int v,int c){int i=++hn,j;for(hv[i]=v,hp[i]=c;i>1&&hp[j=i>>1]>c;i=j)hv[i]=hv[j],hp[i]=hp[j];hv[i]=v;hp[i]=c;}static int pop(int*c){int r=hv[1],v=hv[hn],x=hp[hn--],i=1,j;*c=hp[1];while((j=i<<1)<=hn){if(j<hn&&hp[j+1]<hp[j])j++;if(hp[j]>=x)break;hv[i]=hv[j];hp[i]=hp[j];i=j;}hv[i]=v;hp[i]=x;return r;}static int ok(int x,int mk){return g[x]==2?0:g[x]==3?1:(g[x]^__builtin_parity((unsigned)(mk&a[x])));}static void bfs(int mk,int s){int i,j,l=0,r=0,u=pos[s],need=uc,x,y,nx,ny,v;for(i=0;i<uc;i++)d[mk][s][i]=INF;if(!ok(u,mk))return;vis[u]=++tim;ds[u]=0;q[r++]=u;d[mk][s][s]=0;need--;while(l<r&&need){x=q[l++];y=x%m;for(i=0;i<4;i++){nx=x/m+dx[i];ny=y+dy[i];if(nx<0||nx>=n||ny<0||ny>=m)continue;v=nx*m+ny;if(vis[v]==tim||!ok(v,mk))continue;vis[v]=tim;ds[v]=ds[x]+1;q[r++]=v;if((j=ip[v])!=-1&&d[mk][s][j]==INF)d[mk][s][j]=ds[v],need--;}}}int main(void){FILE*in=fopen("escapelight.in","r"),*out=fopen("escapelight.out","w");int i,j,k,pp,xs,ys,xf,yf,ms,mk,cur,cst,cm,ci,sw,nm,ni,v;if(!in||!out)return 0;fscanf(in,"%d%d",&n,&m);ms=n*m;for(i=0;i<ms;i++)sid[i]=ip[i]=-1;for(i=0;i<n;i++)for(j=0;j<m;j++){fscanf(in,"%d",&g[i*m+j]);if(g[i*m+j]==3)sid[i*m+j]=p++;}fscanf(in,"%d%d%d%d",&xs,&ys,&xf,&yf);st=(xs-1)*m+ys-1;go=(xf-1)*m+yf-1;fscanf(in,"%d%d",&k,&pp);for(i=0;i<k;i++){int xsw,ysw,xl,yl,s,l;fscanf(in,"%d%d%d%d",&xsw,&ysw,&xl,&yl);s=(xsw-1)*m+ysw-1;l=(xl-1)*m+yl-1;a[l]|=1<<sid[s];}for(i=0;i<ms;i++)if(sid[i]!=-1)ip[i]=uc,pos[uc]=i,si[uc]=sid[i],uc++;if(ip[st]==-1)ip[st]=uc,pos[uc]=st,si[uc++]=-1;if(ip[go]==-1)ip[go]=uc,pos[uc]=go,si[uc++]=-1;for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)bfs(mk,i);for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)dist[mk][i]=1e9;hn=0;dist[0][ip[st]]=0;up(ip[st],0);while(hn){cur=pop(&cst);cm=cur/uc;ci=cur%uc;if(cst!=dist[cm][ci])continue;if(ci==ip[go]){fprintf(out,"%d\n",cst+1);return 0;}if((sw=si[ci])!=-1&&(cst<dist[nm=cm^(1<<sw)][ci]))dist[nm][ci]=cst,up(nm*uc+ci,cst);for(i=0;i<uc;i++)if(i!=ci&&(v=d[cm][ci][i])<INF&&(ni=cst+v)<dist[cm][i])dist[cm][i]=ni,up(cm*uc+i,ni);}return 0;} ^ escapelight.c:9:1350: warning: ignoring return value of 'fscanf', declared with attribute warn_unused_result [-Wunused-result] typedef unsigned short us;static int n,m,g[C],a[C],sid[C],ip[C],pos[U],si[U],vis[C],q[C],ds[C],d[S][U][U],dist[S][U],hn,hv[H],hp[H],dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},p,uc,st,go,tim;static void up(int v,int c){int i=++hn,j;for(hv[i]=v,hp[i]=c;i>1&&hp[j=i>>1]>c;i=j)hv[i]=hv[j],hp[i]=hp[j];hv[i]=v;hp[i]=c;}static int pop(int*c){int r=hv[1],v=hv[hn],x=hp[hn--],i=1,j;*c=hp[1];while((j=i<<1)<=hn){if(j<hn&&hp[j+1]<hp[j])j++;if(hp[j]>=x)break;hv[i]=hv[j];hp[i]=hp[j];i=j;}hv[i]=v;hp[i]=x;return r;}static int ok(int x,int mk){return g[x]==2?0:g[x]==3?1:(g[x]^__builtin_parity((unsigned)(mk&a[x])));}static void bfs(int mk,int s){int i,j,l=0,r=0,u=pos[s],need=uc,x,y,nx,ny,v;for(i=0;i<uc;i++)d[mk][s][i]=INF;if(!ok(u,mk))return;vis[u]=++tim;ds[u]=0;q[r++]=u;d[mk][s][s]=0;need--;while(l<r&&need){x=q[l++];y=x%m;for(i=0;i<4;i++){nx=x/m+dx[i];ny=y+dy[i];if(nx<0||nx>=n||ny<0||ny>=m)continue;v=nx*m+ny;if(vis[v]==tim||!ok(v,mk))continue;vis[v]=tim;ds[v]=ds[x]+1;q[r++]=v;if((j=ip[v])!=-1&&d[mk][s][j]==INF)d[mk][s][j]=ds[v],need--;}}}int main(void){FILE*in=fopen("escapelight.in","r"),*out=fopen("escapelight.out","w");int i,j,k,pp,xs,ys,xf,yf,ms,mk,cur,cst,cm,ci,sw,nm,ni,v;if(!in||!out)return 0;fscanf(in,"%d%d",&n,&m);ms=n*m;for(i=0;i<ms;i++)sid[i]=ip[i]=-1;for(i=0;i<n;i++)for(j=0;j<m;j++){fscanf(in,"%d",&g[i*m+j]);if(g[i*m+j]==3)sid[i*m+j]=p++;}fscanf(in,"%d%d%d%d",&xs,&ys,&xf,&yf);st=(xs-1)*m+ys-1;go=(xf-1)*m+yf-1;fscanf(in,"%d%d",&k,&pp);for(i=0;i<k;i++){int xsw,ysw,xl,yl,s,l;fscanf(in,"%d%d%d%d",&xsw,&ysw,&xl,&yl);s=(xsw-1)*m+ysw-1;l=(xl-1)*m+yl-1;a[l]|=1<<sid[s];}for(i=0;i<ms;i++)if(sid[i]!=-1)ip[i]=uc,pos[uc]=i,si[uc]=sid[i],uc++;if(ip[st]==-1)ip[st]=uc,pos[uc]=st,si[uc++]=-1;if(ip[go]==-1)ip[go]=uc,pos[uc]=go,si[uc++]=-1;for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)bfs(mk,i);for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)dist[mk][i]=1e9;hn=0;dist[0][ip[st]]=0;up(ip[st],0);while(hn){cur=pop(&cst);cm=cur/uc;ci=cur%uc;if(cst!=dist[cm][ci])continue;if(ci==ip[go]){fprintf(out,"%d\n",cst+1);return 0;}if((sw=si[ci])!=-1&&(cst<dist[nm=cm^(1<<sw)][ci]))dist[nm][ci]=cst,up(nm*uc+ci,cst);for(i=0;i<uc;i++)if(i!=ci&&(v=d[cm][ci][i])<INF&&(ni=cst+v)<dist[cm][i])dist[cm][i]=ni,up(cm*uc+i,ni);}return 0;} ^ escapelight.c:9:1422: warning: ignoring return value of 'fscanf', declared with attribute warn_unused_result [-Wunused-result] typedef unsigned short us;static int n,m,g[C],a[C],sid[C],ip[C],pos[U],si[U],vis[C],q[C],ds[C],d[S][U][U],dist[S][U],hn,hv[H],hp[H],dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},p,uc,st,go,tim;static void up(int v,int c){int i=++hn,j;for(hv[i]=v,hp[i]=c;i>1&&hp[j=i>>1]>c;i=j)hv[i]=hv[j],hp[i]=hp[j];hv[i]=v;hp[i]=c;}static int pop(int*c){int r=hv[1],v=hv[hn],x=hp[hn--],i=1,j;*c=hp[1];while((j=i<<1)<=hn){if(j<hn&&hp[j+1]<hp[j])j++;if(hp[j]>=x)break;hv[i]=hv[j];hp[i]=hp[j];i=j;}hv[i]=v;hp[i]=x;return r;}static int ok(int x,int mk){return g[x]==2?0:g[x]==3?1:(g[x]^__builtin_parity((unsigned)(mk&a[x])));}static void bfs(int mk,int s){int i,j,l=0,r=0,u=pos[s],need=uc,x,y,nx,ny,v;for(i=0;i<uc;i++)d[mk][s][i]=INF;if(!ok(u,mk))return;vis[u]=++tim;ds[u]=0;q[r++]=u;d[mk][s][s]=0;need--;while(l<r&&need){x=q[l++];y=x%m;for(i=0;i<4;i++){nx=x/m+dx[i];ny=y+dy[i];if(nx<0||nx>=n||ny<0||ny>=m)continue;v=nx*m+ny;if(vis[v]==tim||!ok(v,mk))continue;vis[v]=tim;ds[v]=ds[x]+1;q[r++]=v;if((j=ip[v])!=-1&&d[mk][s][j]==INF)d[mk][s][j]=ds[v],need--;}}}int main(void){FILE*in=fopen("escapelight.in","r"),*out=fopen("escapelight.out","w");int i,j,k,pp,xs,ys,xf,yf,ms,mk,cur,cst,cm,ci,sw,nm,ni,v;if(!in||!out)return 0;fscanf(in,"%d%d",&n,&m);ms=n*m;for(i=0;i<ms;i++)sid[i]=ip[i]=-1;for(i=0;i<n;i++)for(j=0;j<m;j++){fscanf(in,"%d",&g[i*m+j]);if(g[i*m+j]==3)sid[i*m+j]=p++;}fscanf(in,"%d%d%d%d",&xs,&ys,&xf,&yf);st=(xs-1)*m+ys-1;go=(xf-1)*m+yf-1;fscanf(in,"%d%d",&k,&pp);for(i=0;i<k;i++){int xsw,ysw,xl,yl,s,l;fscanf(in,"%d%d%d%d",&xsw,&ysw,&xl,&yl);s=(xsw-1)*m+ysw-1;l=(xl-1)*m+yl-1;a[l]|=1<<sid[s];}for(i=0;i<ms;i++)if(sid[i]!=-1)ip[i]=uc,pos[uc]=i,si[uc]=sid[i],uc++;if(ip[st]==-1)ip[st]=uc,pos[uc]=st,si[uc++]=-1;if(ip[go]==-1)ip[go]=uc,pos[uc]=go,si[uc++]=-1;for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)bfs(mk,i);for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)dist[mk][i]=1e9;hn=0;dist[0][ip[st]]=0;up(ip[st],0);while(hn){cur=pop(&cst);cm=cur/uc;ci=cur%uc;if(cst!=dist[cm][ci])continue;if(ci==ip[go]){fprintf(out,"%d\n",cst+1);return 0;}if((sw=si[ci])!=-1&&(cst<dist[nm=cm^(1<<sw)][ci]))dist[nm][ci]=cst,up(nm*uc+ci,cst);for(i=0;i<uc;i++)if(i!=ci&&(v=d[cm][ci][i])<INF&&(ni=cst+v)<dist[cm][i])dist[cm][i]=ni,up(cm*uc+i,ni);}return 0;} ^ escapelight.c:9:1486: warning: ignoring return value of 'fscanf', declared with attribute warn_unused_result [-Wunused-result] typedef unsigned short us;static int n,m,g[C],a[C],sid[C],ip[C],pos[U],si[U],vis[C],q[C],ds[C],d[S][U][U],dist[S][U],hn,hv[H],hp[H],dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},p,uc,st,go,tim;static void up(int v,int c){int i=++hn,j;for(hv[i]=v,hp[i]=c;i>1&&hp[j=i>>1]>c;i=j)hv[i]=hv[j],hp[i]=hp[j];hv[i]=v;hp[i]=c;}static int pop(int*c){int r=hv[1],v=hv[hn],x=hp[hn--],i=1,j;*c=hp[1];while((j=i<<1)<=hn){if(j<hn&&hp[j+1]<hp[j])j++;if(hp[j]>=x)break;hv[i]=hv[j];hp[i]=hp[j];i=j;}hv[i]=v;hp[i]=x;return r;}static int ok(int x,int mk){return g[x]==2?0:g[x]==3?1:(g[x]^__builtin_parity((unsigned)(mk&a[x])));}static void bfs(int mk,int s){int i,j,l=0,r=0,u=pos[s],need=uc,x,y,nx,ny,v;for(i=0;i<uc;i++)d[mk][s][i]=INF;if(!ok(u,mk))return;vis[u]=++tim;ds[u]=0;q[r++]=u;d[mk][s][s]=0;need--;while(l<r&&need){x=q[l++];y=x%m;for(i=0;i<4;i++){nx=x/m+dx[i];ny=y+dy[i];if(nx<0||nx>=n||ny<0||ny>=m)continue;v=nx*m+ny;if(vis[v]==tim||!ok(v,mk))continue;vis[v]=tim;ds[v]=ds[x]+1;q[r++]=v;if((j=ip[v])!=-1&&d[mk][s][j]==INF)d[mk][s][j]=ds[v],need--;}}}int main(void){FILE*in=fopen("escapelight.in","r"),*out=fopen("escapelight.out","w");int i,j,k,pp,xs,ys,xf,yf,ms,mk,cur,cst,cm,ci,sw,nm,ni,v;if(!in||!out)return 0;fscanf(in,"%d%d",&n,&m);ms=n*m;for(i=0;i<ms;i++)sid[i]=ip[i]=-1;for(i=0;i<n;i++)for(j=0;j<m;j++){fscanf(in,"%d",&g[i*m+j]);if(g[i*m+j]==3)sid[i*m+j]=p++;}fscanf(in,"%d%d%d%d",&xs,&ys,&xf,&yf);st=(xs-1)*m+ys-1;go=(xf-1)*m+yf-1;fscanf(in,"%d%d",&k,&pp);for(i=0;i<k;i++){int xsw,ysw,xl,yl,s,l;fscanf(in,"%d%d%d%d",&xsw,&ysw,&xl,&yl);s=(xsw-1)*m+ysw-1;l=(xl-1)*m+yl-1;a[l]|=1<<sid[s];}for(i=0;i<ms;i++)if(sid[i]!=-1)ip[i]=uc,pos[uc]=i,si[uc]=sid[i],uc++;if(ip[st]==-1)ip[st]=uc,pos[uc]=st,si[uc++]=-1;if(ip[go]==-1)ip[go]=uc,pos[uc]=go,si[uc++]=-1;for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)bfs(mk,i);for(mk=0;mk<(1<<p);mk++)for(i=0;i<uc;i++)dist[mk][i]=1e9;hn=0;dist[0][ip[st]]=0;up(ip[st],0);while(hn){cur=pop(&cst);cm=cur/uc;ci=cur%uc;if(cst!=dist[cm][ci])continue;if(ci==ip[go]){fprintf(out,"%d\n",cst+1);return 0;}if((sw=si[ci])!=-1&&(cst<dist[nm=cm^(1<<sw)][ci]))dist[nm][ci]=cst,up(nm*uc+ci,cst);for(i=0;i<uc;i++)if(i!=ci&&(v=d[cm][ci][i])<INF&&(ni=cst+v)<dist[cm][i])dist[cm][i]=ni,up(cm*uc+i,ni);}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.004 secunde | OK. | 3 | 3 | ||
| 9 | 0.004 secunde | OK. | 5 | 5 | ||
| 10 | 0 secunde | OK. | 2 | 2 | ||
| 11 | 0.008 secunde | OK. | 3 | 3 | ||
| 12 | 0.008 secunde | OK. | 4 | 4 | ||
| 13 | 0.016 secunde | OK. | 2 | 2 | ||
| 14 | Depășit | Limita de timp depășită | 3 | 0 | ||
| 15 | Depășit | Limita de timp depășită | 4 | 0 | ||
| 16 | 0.104 secunde | OK. | 2 | 2 | ||
| 17 | 0.156 secunde | OK. | 3 | 3 | ||
| 18 | 0.364 secunde | OK. | 4 | 4 | ||
| 19 | 0.296 secunde | OK. | 2 | 2 | ||
| 20 | 0.312 secunde | OK. | 3 | 3 | ||
| 21 | Depășit | Limita de timp depășită | 4 | 0 | ||
| 22 | Depășit | Limita de timp depășită | 2 | 0 | ||
| 23 | Depășit | Limita de timp depășită | 3 | 0 | ||
| 24 | Depășit | Limita de timp depășită | 4 | 0 | ||
| 25 | Depășit | Limita de timp depășită | 3 | 0 | ||
| 26 | Depășit | Limita de timp depășită | 3 | 0 | ||
| 27 | Depășit | Limita de timp depășită | 4 | 0 | ||
| Punctaj total | 70 | |||||
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ă.