20 ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΠΡΟΒΛΗΜΑΤΟΣ Β ΦΑΣΗΣ (ΣΑΜΠΟΤΑΖ ΣΤΟ ΓΟΡΓΟΠΟΤΑΜΟ) Περισσότεροι από τους τρεις μαθητές των οποίων τους κώδικες παρουσιάζουμε, υπέβαλαν λύση που συγκέντρωσε το 100% των σημείων επιτυχίας. Από αυτές ενδεικτικά η Επιστημονική Επιτροπή παρουσιάζει μία για κάθε γλώσσα του Διαγωνισμού. PASCAL ΔΗΜΗΤΡΗΣ ΜΟΥΔΗΛΟΣ ΓΕΛ ΑΝΑΒΥΣΣΟΥ. {LANG: PASCAL TASK: sabotage Program sabotage; var width,height,mines,mine_x,mine_y,i:longint; start_x,start_y,end_x,end_y: longint; map:array [1..1000,1..1000] of longint; c_x:array[1..10000] of longint ; c_y:array[1..10000] of longint ; t_x:array[1..10000] of longint; t_y:array[1..10000] of longint ; N,temp_step,step:longint; x,y,tx,ty:longint; ok:boolean; fdata,fdata2:text; Begin assign (fdata,'sabotage.in'); reset (fdata); read (fdata,width); read (fdata,height); read (fdata,mines); if mines<>0 then for i:=1 to mines do read (fdata,mine_x); read (fdata,mine_y); map[mine_x,mine_y]:=-1; read (fdata,start_x); +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 1 από 10
read (fdata,start_y); read (fdata,end_x); read (fdata,end_y); c_x[1]:=end_x; c_y[1]:=end_y; t_x[1]:=end_x; t_y[1]:=end_y; N:=1; temp_step:=0; step:=1; ΕΛΛΗΝΙΚΗ ΕΤΑΙΡΕΙΑ ΕΠΙΣΤΗΜΟΝΩΝ ΚΑΙ While (map[start_x,start_y]=0) and (ok=true) do ok:=false; For i:=1 to step do if c_x[i]+1<=width then if (map[c_x[i]+1,c_y[i]]=0) then map[c_x[i]+1,c_y[i]]:=n; temp_step:=temp_step+1; t_x[temp_step]:=c_x[i]+1; t_y[temp_step]:=c_y[i]; 1,c_y[i]]:=N; if c_x[i]-1>0 then if (map[c_x[i]-1,c_y[i]]=0) then map[c_x[i]- temp_step:=temp_step+1; t_x[temp_step]:=c_x[i]-1; t_y[temp_step]:=c_y[i]; if c_y[i]-1>0 then if (map[c_x[i],c_y[i]-1]=0) then map[c_x[i],c_y[i]-1]:=n; +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 2 από 10
temp_step:=temp_step+1; t_x[temp_step]:=c_x[i]; t_y[temp_step]:=c_y[i]-1; For i:=1 to temp_step do c_x[i]:=t_x[i]; c_y[i]:=t_y[i]; step:=temp_step; N:=N+1; temp_step:=0; close(fdata); map[end_x,end_y]:=0; assign (fdata2,'sabotage.out'); rewrite (fdata2); if map[start_x,start_y]<>0 then x:=start_x; y:=start_y; writeln(fdata2,map[start_x,start_y]+1); writeln(fdata2,x,' ',y); For i:=map[start_x,start_y] downto 1 do tx:=x; ty:=y; ok:=false; if y+1<=height then if (ok=false) and (map[x,y+1]=i- 1) then ty:=y+1; writeln(fdata2,x,' ',ty); if x-1>0 then if (ok=false) and (map[x-1,y]=i- 1) then +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 3 από 10
tx:=x-1; writeln(fdata2,tx,' ',y); if x+1<=width then if (ok=false) and (map[x+1,y]=i-1) then end else close(fdata2); halt(0); End. x:=tx; tx:=x+1; writeln(fdata2,tx,' ',y); y:=ty; writeln(fdata2,'0'); C++ ΙΩΑΝΝΗΣ ΧΑΤΖΗΜΙΧΟΣ 8 ο ΓΕΛ ΛΑΡΙΣΑΣ /* LANG: C++ TASK: sabotage */ #include <cstdio> #include <cstdlib> #include <queue> using namespace std; int moves[3][2] = { {0, -1, {0, 1, {1, 0 ; struct point { int r; int c; ; int par[1001][1001], R, C; +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 4 από 10
void BFS(int r, int c) { queue<point> Q; point cur, next; int i; cur.r = r; cur.c = c; Q.push(cur); ΕΛΛΗΝΙΚΗ ΕΤΑΙΡΕΙΑ ΕΠΙΣΤΗΜΟΝΩΝ ΚΑΙ while(!q.empty()) { cur = Q.front(); Q.pop(); for (i=0; i<3; i++) { next.r = cur.r + moves[i][0]; next.c = cur.c + moves[i][1]; if ( next.r <= 0 next.r > R next.c <= 0 next.c > C ) continue; if ( par[next.r][next.c] ) continue; par[next.r][next.c] = i+1; Q.push(next); int main(void) { FILE *in = fopen("sabotage.in", "r"), *out = fopen("sabotage.out", "w"); int i, M, r, c, sr, sc; int mv[1000001], mvcnt = 0, mvid; fscanf(in, "%d %d %d", &C, &R, &M); for (i=1; i<=m; i++) { fscanf(in, "%d %d", &c, &r); par[r][c] = 8888; fscanf(in, "%d %d", &sc, &sr); BFS(sr, sc); fscanf(in, "%d %d", &c, &r); if (!par[r][c] ) { +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 5 από 10
fprintf(out, "0\n"); else { while (r!=sr c!=sc) { mvid = par[r][c]-1; mv[++mvcnt] = mvid; r -= moves[mvid][0]; c -= moves[mvid][1]; fprintf(out, "%d\n%d %d\n", mvcnt+1, sc, sr); r = sr; c = sc; for (i=mvcnt; i>=1; i--) { r += moves[mv[i]][0]; c += moves[mv[i]][1]; fprintf(out, "%d %d\n", c, r); fclose(in); fclose(out); return 0; C ΑΝΑΣΤΑΣΙΟΣ ΓΕΡΜΑΝΙΔΗΣ ΚΟΛΛΕΓΙΟ ΨΥΧΙΚΟΥ /* LANG: C TASK: sabotage */ #include <stdio.h> #define MAXSIZE 1001 int Qx[MAXSIZE*MAXSIZE], Qy[MAXSIZE*MAXSIZE]; char field[maxsize][maxsize]; int main(void) { FILE *in, *out; in=fopen("sabotage.in", "r"); out=fopen("sabotage.out", "w"); +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 6 από 10
int x=0, y=0, startx=0, starty=0, endx=0, endy=0, mines=0, minex=0, miney=0, steps=0, tailqx=0, tailqy=0, headqx=0, headqy=0, i=0, p=0, direction=0, mode=0, ux=0, uy=0, vx=0, vy=0, kx=0, ky=0, found=0, finished=0; for (i=1; i<x+1; i++) { for (p=1; p<y+1; p++) { field[i][p] = 0; for (i=0;i<(x+1)*(y+1);i++) { Qx[i]=0; Qy[i]=0; fscanf(in,"%d %d\n", &x, &y); if (startx>endx) { direction=1; fscanf(in,"%d\n", &mines); for (i=0;i<mines;i++) { fscanf(in,"%d %d\n", &minex, &miney); field[minex][miney]=1; minex=0; miney=0; fscanf(in,"%d %d\n", &startx, &starty); fscanf(in,"%d %d\n", &endx, &endy); fclose(in); field[startx][starty]=4; Qx[tailqx++]=startx; Qy[tailqy++]=starty; while (!finished) { ux=qx[headqx]; uy=qy[headqy]; if (ux==0 && uy==0) { finished=1; +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 7 από 10
for (i=0;i<3 && ux!=0 && uy!=0;i++) { vx=0; vy=0; if (!direction) { if (field[ux+1][uy]==0 && ux!=x) { vx=ux+1; vy=uy; mode=1; else if (field[ux][uy+1]==0 && uy!=endy) { vy=uy+1; vx=ux; mode=2; else if (field[ux-1][uy]==0 && ux!=1) { vx=ux-1; vy=uy; mode=3; uy!=endy) { { else if (direction) { if (field[ux-1][uy]==0 && ux!=1) { vx=ux-1; vy=uy; mode=3; else if (field[ux][uy+1]==0 && vy=uy+1; vx=ux; mode=2; else if (field[ux+1][uy]==0 && ux!=x) vx=ux+1; vy=uy; mode=1; if (vx!= 0 && vy!= 0 && field[vx][vy]==0) { field[vx][vy]=mode; if (vx==endx && vy==endy) { found=1; +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 8 από 10
finished=1; Qx[tailqx++]=vx; Qy[tailqy++]=vy; headqx++; headqy++; steps++; if (!found) { fprintf(out,"%d\n",0); else { kx=endx; ky=endy; for(i=0;i<(x+1)*(y+1);i++) { Qx[i]=0; Qy[i]=0; for (i=steps+1; i>0; i--) { if (field[kx][ky]!=4) { if (field[kx][ky]==1) { Qx[i]=kx-1; Qy[i]=ky; else if (field[kx][ky]==2) { Qx[i]=kx; Qy[i]=ky-1; else if (field[kx][ky]==3) { Qx[i]=kx+1; Qy[i]=ky; kx=qx[i]; ky=qy[i]; for (p=0; Qx[p]==0;p++) { ; +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 9 από 10
fprintf(out,"%d\n", steps-p+3); for (i=p;i<steps+2;i++) { fprintf(out,"%d %d\n", Qx[i], Qy[i]); fprintf(out,"%d %d\n", endx, endy); fclose(out); return(0); +30-210-3300999, fax +30-210-3301893 E-mail: epy@epy.gr, Web: www.epy.gr 10 από 10