Afişează mesaje
|
Pagini: 1 2 [3] 4
|
51
|
infoarena - concursuri, probleme, evaluator, articole / Informatica / Răspuns: Replace sir de caractere
|
: Ianuarie 09, 2012, 19:15:07
|
Am facut cum ai zis,dar nu stiu de ce nu face nici o modificare. Si ar mai fi o problema daca ar merge.Am vazut pe exeplulul la functia strstr de pe c++ reference ca daca in locul cuvantului care tebuie inlocuit pun un cuvant mai mare strncpy imi inlocuieste si din alte cuvinte,sau daca e mai mic lasa litere in plus... #include<cstdio> #include<cstring> using namespace std; char caut[10][80],inloc[10][80],cuv[260]; int n; int main(){ int i; int l; char * p; FILE * pFile; pFile=fopen("replace.in","r"); fscanf(pFile,"%d\n",&n); for(i=1;i<=n;i++){ fgets(caut[i],80,pFile); fgets(inloc[i],80,pFile); } fgets(cuv,255,pFile); for(i=1;i<=n;i++){ p=strstr(cuv,caut[i]); while(p!=NULL){ l=strlen(inloc[i]); strncpy(p,inloc[i],l); } } pFile=fopen("replace.out","w"); fprintf(pFile,"%s",cuv); return 0; }
|
|
|
53
|
infoarena - concursuri, probleme, evaluator, articole / Informatica / Răspuns: Problema mobile
|
: Ianuarie 05, 2012, 17:28:32
|
Am incercat sa fac cu ai spus tu insa nu stiu de ce nu merge....pe exemplu imi da: 1 si 1 , 2 si 2 , 3 si 3 in loc de: 1 si 1 , 3 si 4 nu stiu ce am gresit ca am incercat sa urmez pasii pe care mi-ai dat......daca ai timp uitate te rog peste cod poate observi ce nu e bine #include<cstdio> using namespace std; int min(int a,int b){ if(a<b) return a; return b; } int main(){ int n,m,m1=1,n1=1,m2=1,n2=1,min1,min2,p,n3,m3,nr=0,mat[10000][2],i; FILE * pFile; pFile=fopen("mobile.in","r"); fscanf(pFile,"%d%d",&m,&n); while(m2!=m || n2!=n){ if(m1%2==0) min1=n1-1; else min1=n-n1; if(n2%2==0) min2=m2-1; else min2=m-m2; p=min(min1,min2); n3=n1; m3=m2; if(m1%2==0) n1=n1-p; else n1=n1+p; if(n2%2==0) m2=m2-p; else m2=m2+p; if(m1%2==0 && n2%2==0){ if((m2<=m1 && m1<=m3) && (n2<=n3 && n1<=n2)){ nr++; mat[nr][0]=m1; mat[nr][1]=n2; } } if(m1%2!=0 && n2%2!=0){ if((m2>=m1 && m1>=m3) && (n2>=n3 && n1>=n2)){ nr++; mat[nr][0]=m1; mat[nr][1]=n2; } } if(m1%2!=0 && n2%2==0){ if((m2<=m1 && m1<=m3) && (n2>=n3 && n1>=n2)){ nr++; mat[nr][0]=m1; mat[nr][1]=n2; } } if(m1%2==0 && n2%2!=0){ if((m2>=m1 && m1>=m3) && (n2<=n3 && n1<=n2)){ nr++; mat[nr][0]=m1; mat[nr][1]=n2; } } if(n1==n || n1==1){ m1++;m2++; } else if(m2==m || m2==1){ n2++;n1++;} if(m1==m2 && n1==n2){ nr++; mat[nr][0]=m1; mat[nr][1]=n2; } } pFile=fopen("mobile.out","w"); fprintf(pFile,"%d\n",nr); for(i=1;i<=nr;i++) fprintf(pFile,"%d %d\n",mat[i][0],mat[i][1]); return 0; }
|
|
|
59
|
infoarena - concursuri, probleme, evaluator, articole / Informatica / Aplicare grafuri
|
: Septembrie 30, 2011, 16:16:25
|
Am si eu o intrebare.Cum se pot aplica grafurile pe probleme gen insule de la OJI 2009 sau ai de OJI 2011 ??Am citit teoria grafurilor( http://campion.edu.ro/arhiva/www/arhiva_2009/seds/17/index.htm) de pe .campion ,dar nu prea imi dau seama cum se poate aplica pe probleme de genul celor de mai sus(poate mai imi puteti da ceva de citit de unde sa inteleg mai bine).Stiu ca se pot rezolva cu Lee sau fill unele ,dar am vazut ca desi la indicatii pe .campion da Lee pe infoarena arata ca se rezolva cu grafuri(si is curios cum se pot aplica:D). Ma puteti ajuta cu niste explicatii si eventual niste probleme de inceput cu grafuri daca credeti ca insule si ai sunt prea complicate pt inceput ??
|
|
|
60
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 824 Insule
|
: Septembrie 22, 2011, 14:36:39
|
Pai tu zici ca atunci cand fac fill-ul daca gasesc o zona cu apa cu vecin tara R il retin intr-o coada.Bun si dupa ce determin toate punctele nu trebuie sa iau fiecare punct si pe o matrice noua ca si cea initiala pe care o citesc sa fac Lee(matricea trebuie sa fie tot timpul cea initiala ca sa pot pune lungimea drumului pe ea adica primul punct o sa aiba val 1 dupa aceea urmatoarele vecine 2 si tot asa pana dau de o zona cu vecin tara G)??Deci nu e acelasi lucru cu ce am facut eu numai ca mai folosesc inca o coada pt a retine punctele si dupaia fac Lee?
|
|
|
61
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 824 Insule
|
: Septembrie 20, 2011, 21:00:13
|
Mersi n-am vazut faza cu coada ca eu o pneam de la 1 si la primul pas se termina for-ul deaia imi tot dadea 9999. George eu folosesc matricea pod din functia din functia Lee care ia de fiecare data valoarile din matricea M care e o copie a matricei mat,pe care no schimb. Dar inca mai am o problema ca nu stiu de ce nu merge calumea Lee-ul.Drumul care il calculeaza nu e corect ,dar nu stiu de ce.
|
|
|
62
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 824 Insule
|
: Septembrie 20, 2011, 19:03:31
|
Da nu imi iese podul nici cum tot 99999 imi da si nu stiu de ce.Deci eu m-am gandit asa sa fac un fill care determina numarul de insule si in paralel fac un Lee care imi determina lungimea podului.Pentru Lee am facut o functie care este apelata numai cand lanag gasesc o zona de apa care are vecin o tara R.Cand gasesc asta apelez functia care face Lee prin toata matricea si cand gaseste o zona de apa care are vecin o tara G. Daca lungimea pana acolo e mai mica decat min atunci min are lungimea respectiva.Daca poti,uitate un pic pe cod ,ca eu chiar nu-mi dau seama ce nu merge Mersi:D #include<cstdio> using namespace std; int mat[101][101],n,m,M[101][101],min=99999; const int dx[] = { -1, 0, 1, 0 },dy[] = { 0, 1, 0, -1 }; void Lee(int x, int y,int pod[101][101]){ int xnou,ynou,p,u,c[101][2],xx,yy,d; pod[x][y]=1; c[1][0]=x;c[1][1]=y; for(p=0,u=0;p<=u;p++){ xx=c[p][0];yy=c[p][1]; for(d=0;d<4;d++){ xnou=xx+dx[d]; ynou=yy+dy[d]; if(xnou>=1 && ynou>=1 && xnou<=n && ynou<=m && pod[xnou][ynou]==2){ if(pod[xx][yy]<min)min=pod[xx][yy]; } if(xnou>=1 && ynou>=1 && xnou<=n && ynou<=m && !pod[xnou][ynou]){ pod[xnou][ynou]=pod[xx][yy]+1; c[++u][0]=xnou; c[u][1]=ynou; } } } } void fill(int x,int y,int z){ int xnou,ynou,i; for(i=0;i<4;i++){ xnou=x+dx[i]; ynou=y+dy[i]; if(xnou>=1 && ynou>=1 && xnou<=n && ynou<=m && !M[xnou][ynou] && z==1){ Lee(xnou,ynou,M);} if( xnou < 1 || ynou < 1 || xnou > n || ynou > m || !mat[xnou][ynou]) continue; if(mat[xnou][ynou]==z){mat[xnou][ynou]=0; fill(xnou,ynou,z);} } } int main(){ int i,j,R=0,G=0,B=0; char c; FILE * pFile; pFile=fopen("insule.in","r"); fscanf(pFile,"%d%d\n",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ fscanf(pFile,"%c",&c); mat[i][j]=c-'0'; M[i][j]=mat[i][j]; } fscanf(pFile,"%c",&c); } pFile=fopen("insule.out","w"); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(mat[i][j]==1){R++;fill(i,j,1);} if(mat[i][j]==2){G++;fill(i,j,2);} if(mat[i][j]==3){B++;fill(i,j,3);} } } pFile=fopen("insule.out","w"); fprintf(pFile,"%d %d %d %d\n",R,G,B,min); return 0; }
|
|
|
63
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 824 Insule
|
: Septembrie 20, 2011, 14:38:30
|
Am incercat sa rezolv problema folosind o noua matrice,dar nu stiu de ce imi da o eroare dupa ce compilez ceva cu return code -1073.... Ma puteti ajuta?? #include<cstdio> using namespace std; int mat[101][101],n,m,M[101][101],min=99999; const int dx[] = { -1, 0, 1, 0 },dy[] = { 0, 1, 0, -1 }; void Lee(int x, int y,int pod[101][101]){ int xnou,ynou,p,u,c[101][2],xx,yy,d; pod[x][y]=1; c[1][0]=x;c[1][1]=y; for(p=0,u=0;p<=u;p++){ xx=c[p][0];yy=c[p][1]; for(d=0;d<4;d++){ xnou=xx+dx[d]; ynou=yy+dy[d]; if(xnou>=1 && ynou>=1 && xnou<=n && ynou<=m && pod[xnou][ynou]==2){ if(pod[xx][yy]<min)min=pod[xx][yy]; } if(xnou>=1 && ynou>=1 && xnou<=n && ynou<=m && !pod[xnou][ynou]){ pod[xnou][ynou]=pod[xx][yy]+1; c[++u][0]=xnou; c[u][1]=ynou; } } } } void fill(int x,int y,int z){ int xnou,ynou,i; for(i=0;i<4;i++){ xnou=x+dx[i]; ynou=y+dy[i]; if(xnou>=1 && ynou>=1 && xnou<=n && ynou<=m && !M[xnou][ynou]){ Lee(xnou,ynou,M);} if( xnou < 1 || ynou < 1 || xnou > n || ynou > m || !mat[xnou][ynou]) continue; if(mat[xnou][ynou]==z){mat[xnou][ynou]=0; fill(xnou,ynou,z);} } } int main(){ int i,j,R=0,G=0,B=0; char c; FILE * pFile; pFile=fopen("insule.in","r"); fscanf(pFile,"%d%d\n",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ fscanf(pFile,"%c",&c); mat[i][j]=c-'0'; M[i][j]=mat[i][j]; } fprintf(pFile,"\n"); } pFile=fopen("insule.out","w"); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(mat[i][j]==1){R++;fill(i,j,1);} if(mat[i][j]==2){G++;fill(i,j,2);} if(mat[i][j]==3){B++;fill(i,j,3);} } } pFile=fopen("insule.out","w"); fprintf(pFile,"%d %d %d %d\n",R,G,B,min); return 0; }
|
|
|
64
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 824 Insule
|
: Septembrie 19, 2011, 11:56:00
|
Ma puteti ajuta si pe mine la rezolvarea acestei probleme?? Am determinat numar de insule cu flood fill,dar nu stiu cum sa determin podul... Stiu ca se face cu Lee luand punctele care au vecin o tara R si facand Lee pana la o tara G,dar nu stiu cum sa fac asta(sa folosesc o noua matrice sau cum??) ... Aici e determinarea insulelor: #include<cstdio> using namespace std; int mat[101][101],n,m; const int dx[] = { -1, 0, 1, 0 },dy[] = { 0, 1, 0, -1 }; void fill(int x,int y,int z){ int xnou,ynou,i; for(i=0;i<4;i++){ xnou=x+dx[i]; ynou=y+dy[i]; if( xnou < 1 || ynou < 1 || xnou > n || ynou > m || !mat[xnou][ynou]) continue; if(mat[xnou][ynou]==z){mat[xnou][ynou]=0; fill(xnou,ynou,z);} } } int main(){ int i,j,R=0,G=0,B=0; char c; FILE * pFile; pFile=fopen("insule.in","r"); fscanf(pFile,"%d%d\n",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ fscanf(pFile,"%c",&c); mat[i][j]=c-'0'; } fprintf(pFile,"\n"); } pFile=fopen("insule.out","w"); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(mat[i][j]==1){R++;fill(i,j,1);} if(mat[i][j]==2){G++;fill(i,j,2);} if(mat[i][j]==3){B++;fill(i,j,3);} } fprintf(pFile,"\n"); } pFile=fopen("insule.out","w"); fprintf(pFile,"%d %d %d\n",R,G,B); return 0; }
|
|
|
66
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 496 Rj
|
: August 22, 2011, 17:08:16
|
Problema e ca cred ca manca o linie pentru ca daca bag codul acesta: #include<cstdio> using namespace std; short n,m,i,j,mat[150][150],xr,yr,xj,yj; char c[150]; int main(){ FILE * pFile; pFile=fopen("rj.in","r"); fscanf(pFile,"%d%d",&n,&m); for(i=0;i<n;i++){ fgets (c,150,pFile); for(j=0;j<m;j++){ if(c[j]==' ')mat[i][j]=0; if(c[j]=='X')mat[i][j]=-1; if(c[j]=='R'){xr=i;yr=j;mat[i][j]=1;} if(c[j]=='J'){xj=i;yj=j;mat[i][j]=1;} } } pFile=fopen("rj.out","w"); for(i=0;i<n;i++){ for(j=0;j<m;j++){ fprintf(pFile,"%d",mat[i][j]); fprintf(pFile," "); } fprintf(pFile,"\n"); } return 0; } pe exemplu imi da: 0 0 0 0 0 1 0 -1 -1 0 -1 0 -1 0 -1 -1 0 -1 -1 -1 -1 0 -1 0 -1
si nu mai pune si linia cu Julieta iar prima linie o pune 0 0 0 0 0
|
|
|
68
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 496 Rj
|
: August 22, 2011, 16:16:00
|
Cum pot sa fac o citire cu #include<cstdio> ca sami ia corect toate spatiile?? Eu am incercat asa,dar nu face ceva corect char c[150]; FILE * pFile; pFile=fopen("rj.in","r"); fscanf(pFile,"%d%d",&n,&m); for(i=0;i<n;i++){ fgets (c, m+1, pFile); for(j=0;j<m;j++){ if(c[j]==' ')mat[i][j]=0; if(c[j]=='X')mat[i][j]=-1; if(c[j]=='R'){xr=i;yr=j;mat[i][j]=1;} if(c[j]=='J'){xj=i;yj=j;mat[i][j]=1;} } }
|
|
|
70
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 477 Alee
|
: August 20, 2011, 11:53:41
|
Buna am incercat sa rezolv si eu problema cu un Lee ,dar nu stiu din ce cauza imi da doar 90p... Am incercat 2 variante una in care parcurgeam toata matricea ca sa aflu pasul de dinainte si dupaia marcam toti vecini cu pasul de dinainte +1 si asa imi pica la cel mai mare test la timp de executie,iar cand am facut cu o coada in care am retinut punctele imi pica la alt test,tot la timpu de executie Aici e rezolvarea cu coada: #include<cstdio> using namespace std; #define Nmax 175 int mat[Nmax][Nmax],c[Nmax*Nmax][3],N,M,x,y,x1,y1,x2,y2,p,u,xnou,ynou,d,i,j,m; const int di[] = { -1, 0, 1, 0 },dj[] = { 0, 1, 0, -1 }; bool OK(int k,int q){ if(mat[k][q]!=0){return false;} if(k<1 || q<1 || k>N || q>N){ return false;} return true; } void Lee(){ c[1][1]=x1;c[1][2]=y1; for(p=1,u=1;p<=u;p++){ m=u; for(j=p;j<=m;j++){ x=c[j][1]; y=c[j][2]; for(d=0;d<4;d++){ xnou=x+di[d]; ynou=y+dj[d]; if(OK(xnou,ynou)){ mat[xnou][ynou]=p+1; c[++u][1]=xnou; c[u][2]=ynou; if(xnou==x2 && ynou==y2){ return; } } } } } } int main(){ FILE * pFile; pFile=fopen("alee.in","r"); fscanf(pFile,"%d%d",&N,&M); for(i=1;i<=M;i++){ fscanf(pFile,"%d%d",&x,&y); mat[x][y]=-1; } fscanf(pFile,"%d%d%d%d",&x1,&y1,&x2,&y2); mat[x1][y1]=1; Lee(); pFile=fopen("alee.out","w"); fprintf(pFile,"%d",mat[x2][y2]); return 0; }
|
|
|
71
|
infoarena - concursuri, probleme, evaluator, articole / .CAMPION / Răspuns: Spioni
|
: August 09, 2011, 14:11:04
|
Buna am refacut problema.De data asta am facut os tructura de date in care am retinut toti spionii si dupaia am retinut toate punctele in care poate fi un spion si apoi vectorul acela care are toate punctele unde poate fi un spion l-am sortat si dupaia fac o cautare binara ca sa intersectez cei 2 vectori,dar nu stiu de ce cautarea mea binara nu functioneaza corect........ Ma puteti ajuta?? #include<cstdio> #include<algorithm> using namespace std; int m,i; char c[100001]; struct spion{ int x,y; }a[1001],b[800001]; inline bool compare( const spion& p1, const spion& p2 ) { return p1.x == p2.x ? p1.y < p2.y : p1.x < p2.x; }
int caut (int s, int d) { if(s>d) return -1; else { m =(s+d)/2; if (a[i].x==b[m].x){ if(a[i].y==b[m].y)return 1; if(a[i].y<b[i].y)return caut(s,m-1); if(a[i].y>b[i].y)return caut(m+1,d); } if (a[i].x<b[m].x){ return caut(s,m-1);} if(a[i].x>b[m].x){ return caut(m+1,d);} } } int main(){ int n,k,s=-1,j,xa=0,ya=0,gasit=0; int dx[]={-1,0,1,-1,0,1,-1,0,1}, dy[]={-1,-1,-1,0,0,0,1,1,1}; FILE * pFile; pFile=fopen("spioni.in","r"); fscanf(pFile,"%d",&n); for(i=0;i<n;i++){ fscanf(pFile,"%d%d",&a[i].x,&a[i].y); } fscanf(pFile,"%d",&k); fscanf(pFile,"%s",&c); for(j=0;j<9;j++){ s++; b[s].x=xa+dx[j]; b[s].y=ya+dy[j]; } for(i=0;i<k;i++){ if(c[i]=='N')ya++; if(c[i]=='S')ya--; if(c[i]=='V')xa--; if(c[i]=='E')xa++; for(j=0;j<9;j++){ s++; b[s].x=xa+dx[j]; b[s].y=ya+dy[j]; } } sort( b, b+s+1, compare ); pFile=fopen("spioni.out","w"); for(i=0;i<n;i++){ if(caut(1,s)==1){fprintf(pFile,"%d\n",i+1);gasit=1;} } if(!gasit)fprintf(pFile,"-1"); return 0; }
|
|
|
|