Hướng dẫn giải của Cijevi
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
const maxn=25; dx:array[1..4] of shortint=(-1,0,1,0); dy:array[1..4] of shortint=(0,1,0,-1); var m,n,rex,rey,x,y,x1,y1,pre,pre1:byte; rec:char; s:array[0..1,0..1] of byte; a:array[1..maxn,1..maxn,1..maxn,1..maxn] of byte; b:array[1..maxn,1..maxn] of char; d:array[1..maxn,1..maxn] of byte; function max(a,b:byte):byte; begin if a>b then max:=a else max:=b; end; procedure rf; var i,j:byte; c:char; begin fillchar(a,sizeof(a),0); readln(m,n); for i:=1 to m do begin for j:=1 to n do begin read(c); b[i,j]:=c; if c='M' then begin s[0,0]:=i; s[0,1]:=j; end; if c='Z' then begin s[1,0]:=i; s[1,1]:=j; end; if (c='|') or (c='+') or (c='1') or (c='4') then begin a[i,j,i+1,j]:=1; a[i+1,j,i,j]:=1; end; if (c='|') or (c='+') or (c='2') or (c='3') then begin a[i,j,i-1,j]:=1; a[i-1,j,i,j]:=1; end; if (c='-') or (c='+') or (c='1') or (c='2') then begin a[i,j,i,j+1]:=1; a[i,j+1,i,j]:=1; end; if (c='-') or (c='+') or (c='3') or (c='4') then begin a[i,j,i,j-1]:=1; a[i,j-1,i,j]:=1; end; end; readln; end; fillchar(d,sizeof(d),0); end; function check(p,q:byte):boolean; begin check:=(p>0) and (q>0) and (p<=m) and (q<=n); end; procedure go(k:byte); var j,xt,yt:byte; kt:boolean; begin x:=s[k,0]; y:=s[k,1]; d[x,y]:=1; for j:=1 to 4 do begin xt:=x+dx[j]; yt:=y+dy[j]; if check(xt,yt) and (a[x,y,xt,yt]=1) then begin a[x,y,xt,yt]:=0; a[xt,yt,x,y]:=0; x:=xt; y:=yt; d[x,y]:=1; pre:=j; break; end; end; while true do begin if b[x,y]='+' then begin xt:=x+dx[pre]; yt:=y+dy[pre]; if (a[x,y,xt,yt]=1) and (b[xt,yt]<>'.') then begin a[x,y,xt,yt]:=0; a[xt,yt,x,y]:=0; x:=xt; y:=yt; d[x,y]:=1; end else break; end else begin kt:=false; for j:=1 to 4 do begin xt:=x+dx[j]; yt:=y+dy[j]; if check(xt,yt) and (a[x,y,xt,yt]=1) and (b[xt,yt]<>'.') then begin a[x,y,xt,yt]:=0; a[xt,yt,x,y]:=0; x:=xt; y:=yt; pre:=j; d[x,y]:=1; kt:=true; break; end; end; if not kt then break; end; end; if b[x,y]='1' then begin if pre=4 then pre:=3 else pre:=2; end; if b[x,y]='2' then begin if pre=3 then pre:=2 else pre:=1; end; if b[x,y]='3' then begin if pre=2 then pre:=1 else pre:=4; end; if b[x,y]='4' then begin if pre=1 then pre:=4 else pre:=3; end; end; procedure pr; var i,j:byte; kt:boolean; begin go(0); x1:=x; y1:=y; pre1:=pre; go(1); kt:=false; for i:=1 to m do for j:=1 to n do if (d[i,j]=0) and (b[i,j]<>'.') then kt:=true; if x=x1 then begin rex:=x; rey:=(y+y1) div 2; rec:='-'; end; if y=y1 then begin rex:=(x+x1) div 2; rey:=y; rec:='|'; end; if x1+y1=x+y then begin if (pre=3) or (pre1=3) then begin rex:=max(x,x1); rey:=max(y,y1); rec:='3'; end else begin rex:=x+x1-max(x,x1); rey:=y+y1-max(y,y1); rec:='1'; end; end; if x1+y=x+y1 then begin if (pre=3) or (pre1=3) then begin rex:=max(x,x1); rey:=y+y1-max(y,y1); rec:='2'; end else begin rex:=x+x1-max(x,x1); rey:=max(y,y1); rec:='4'; end; end; if kt then rec:='+'; end; procedure wf; begin write(rex,' ',rey,' ',rec); end; begin rf; pr; wf; end.
Code mẫu của RR
{$R+,Q+} {$mode objFPC} uses math; const FINP=''; FOUT=''; MAXN=30; var f1,f2:text; lu,lv,m,n,startu,startv,targetu,targetv:longint; lc:char; ok,ok2:boolean; a:array[1..MAXN,1..MAXN] of char; xet:array[-1..MAXN,-1..MAXN] of longint; procedure openF; begin assign(f1,FINP); reset(f1); assign(f2,FOUT); rewrite(f2); end; procedure closeF; begin close(f1); close(f2); end; procedure inp; var i,j:longint; begin readln(f1,m,n); for i:=1 to m do begin for j:=1 to n do begin read(f1,a[i,j]); if a[i,j]='M' then begin startu:=i; startv:=j; end; if a[i,j]='Z' then begin targetu:=i; targetv:=j; end; end; readln(f1); end; end; procedure ans; begin writeln(f2,lu,' ',lv,' ',lc); end; function check(u,v,h:longint):boolean; inline; begin if (u<=0) or (v<=0) or (u>m) or (v>n) then exit(false); if a[u,v]='Z' then exit(true); if a[u,v]='M' then exit(true); case h of 1: if a[u,v] in ['2','3','|','+'] then exit(true) else exit(false); 2: if a[u,v] in ['1','2','-','+'] then exit(true) else exit(false); 3: if a[u,v] in ['1','4','|','+'] then exit(true) else exit(false); 4: if a[u,v] in ['3','4','-','+'] then exit(true) else exit(false); end; end; procedure visit(u,v:longint); begin if (u<=0) or (v<=0) or (u>m) or (v>n) then exit; if xet[u,v]=1 then exit; xet[u,v]:=1; case a[u,v] of 'M': begin if (u>1) and (a[u-1,v]<>'.') then visit(u-1,v); if (u<m) and (a[u+1,v]<>'.') then visit(u+1,v); if (v>1) and (a[u,v-1]<>'.') then visit(u,v-1); if (v<n) and (a[u,v+1]<>'.') then visit(u,v+1); end; '|': begin if ok2 then ok2:=check(u-1,v,3); if ok2 then ok2:=check(u+1,v,1); if (xet[u-1,v]=0) then visit(u-1,v); if (xet[u+1,v]=0) then visit(u+1,v); end; '-': begin if ok2 then ok2:=check(u,v-1,2); if ok2 then ok2:=check(u,v+1,4); if (xet[u,v-1]=0) then visit(u,v-1); if (xet[u,v+1]=0) then visit(u,v+1); end; '+': begin if ok2 then ok2:=check(u-1,v,3); if ok2 then ok2:=check(u+1,v,1); if ok2 then ok2:=check(u,v-1,2); if ok2 then ok2:=check(u,v+1,4); if (xet[u-1,v]=0) then visit(u-1,v); if (xet[u+1,v]=0) then visit(u+1,v); if (xet[u,v-1]=0) then visit(u,v-1); if (xet[u,v+1]=0) then visit(u,v+1); end; '1': begin if ok2 then ok2:=check(u,v+1,4); if ok2 then ok2:=check(u+1,v,1); if (xet[u,v+1]=0) then visit(u,v+1); if (xet[u+1,v]=0) then visit(u+1,v); end; '2': begin if ok2 then ok2:=check(u-1,v,3); if ok2 then ok2:=check(u,v+1,4); if (xet[u-1,v]=0) then visit(u-1,v); if (xet[u,v+1]=0) then visit(u,v+1); end; '3': begin if ok2 then ok2:=check(u-1,v,3); if ok2 then ok2:=check(u,v-1,2); if (xet[u-1,v]=0) then visit(u-1,v); if (xet[u,v-1]=0) then visit(u,v-1); end; '4': begin if ok2 then ok2:=check(u,v-1,2); if ok2 then ok2:=check(u+1,v,1); if (xet[u,v-1]=0) then visit(u,v-1); if (xet[u+1,v]=0) then visit(u+1,v); end; '.': begin lu:=u; lv:=v; end; 'Z': ok:=true; end; end; procedure solve; var tu,tv:longint; begin visit(startu,startv); tu:=lu; tv:=lv; //Xet + ok:=false; ok2:=true; fillchar(xet,sizeof(xet),0); lu:=0; a[tu,tv]:='+'; visit(startu,startv); if (lu=0) and ok and ok2 then begin lu:=tu; lv:=tv; lc:='+'; exit; end; //Xet | ok:=false; ok2:=true; fillchar(xet,sizeof(xet),0); lu:=0; a[tu,tv]:='|'; visit(startu,startv); if (lu=0) and ok and ok2 then begin lu:=tu; lv:=tv; lc:='|'; exit; end; //Xet - ok:=false; ok2:=true; fillchar(xet,sizeof(xet),0); lu:=0; a[tu,tv]:='-'; visit(startu,startv); if (lu=0) and ok and ok2 then begin lu:=tu; lv:=tv; lc:='-'; exit; end; //Xet 1 ok:=false; ok2:=true; fillchar(xet,sizeof(xet),0); lu:=0; a[tu,tv]:='1'; visit(startu,startv); if (lu=0) and ok and ok2 then begin lu:=tu; lv:=tv; lc:='1'; exit; end; //Xet 2 ok:=false; ok2:=true; fillchar(xet,sizeof(xet),0); lu:=0; a[tu,tv]:='2'; visit(startu,startv); if (lu=0) and ok and ok2 then begin lu:=tu; lv:=tv; lc:='2'; exit; end; //Xet 3 ok:=false; ok2:=true; fillchar(xet,sizeof(xet),0); lu:=0; a[tu,tv]:='3'; visit(startu,startv); if (lu=0) and ok and ok2 then begin lu:=tu; lv:=tv; lc:='3'; exit; end; //Xet 4 ok:=false; ok2:=true; fillchar(xet,sizeof(xet),0); lu:=0; a[tu,tv]:='4'; visit(startu,startv); if (lu=0) and ok and ok2 then begin lu:=tu; lv:=tv; lc:='4'; exit; end; end; begin openF; inp; solve; ans; closeF; end.
Code mẫu của hieult
#include <cstdio> #include <cstring> //#include <conio.h> char a[30][30]; int n,m; bool trai(int r,int c){ return ((c>=0) && (a[r][c-1]=='+' || a[r][c-1]=='-' || a[r][c-1]=='1' || a[r][c-1]=='2')); } bool phai(int r,int c){ return ((c<m)&& (a[r][c+1]=='+' || a[r][c+1]=='-' || a[r][c+1]=='3' || a[r][c+1]=='4')); } bool tren(int r,int c){ return ((r>=0) && (a[r-1][c]=='+' || a[r-1][c]=='|' || a[r-1][c]=='1' || a[r-1][c]=='4')); } bool duoi(int r,int c){ return ((r<n) && (a[r+1][c]=='+' || a[r+1][c]=='|' || a[r+1][c]=='2' || a[r+1][c]=='3')); } int main() { // freopen("CIJEVI.in","r",stdin); scanf("%d %d",&n,&m); for(int i = 0;i<n;i++) scanf("%s",a[i]); for(int i = 0;i<n;i++) for(int j = 0;j<m;j++) { if(a[i][j] == '.') { if(trai(i,j)&&phai(i,j)&&tren(i,j)&&duoi(i,j)) {printf("%d %d +",i+1,j+1); return 0;} if(trai(i,j)&&phai(i,j)) {printf("%d %d -",i+1,j+1); return 0;} if(tren(i,j)&&duoi(i,j)) {printf("%d %d |",i+1,j+1); return 0;} if(trai(i,j)&&duoi(i,j)) {printf("%d %d 4",i+1,j+1); return 0;} if(trai(i,j)&&tren(i,j)) {printf("%d %d 3",i+1,j+1); return 0;} if(phai(i,j)&&duoi(i,j)) {printf("%d %d 1",i+1,j+1); return 0;} if(phai(i,j)&&tren(i,j)) {printf("%d %d 2",i+1,j+1); return 0;} } } // getch(); }
Code mẫu của ll931110
Program CIJEVI; Const input = ''; output = ''; maxn = 25; d: array[1..6,1..2,1..2] of integer = (((1,2),(4,3)),((3,2),(4,1)),((2,1),(3,4)),((2,3),(1,4)),((2,2),(4,4)),((1,1),(3,3))); h: array[1..4,1..3] of integer = ((1,4,6),(3,4,5),(2,3,6),(1,2,5)); dx: array[1..4] of integer = (-1,0,1,0); dy: array[1..4] of integer = (0,1,0,-1); Var a: array[0..maxn + 1,0..maxn + 1] of char; t: array[1..7] of char; r,c,cx,cy: integer; sx,sy,fx,fy: integer; brnum,count: integer; check: boolean; Procedure init; Var f: text; i,j: integer; Begin Assign(f, input); Reset(f); Readln(f, r, c); For i:= 0 to r + 1 do For j:= 0 to c + 1 do a[i,j]:= '.'; For i:= 1 to r do Begin For j:= 1 to c do Begin read(f, a[i,j]); If a[i,j] <> '.' then inc(brnum); End; Readln(f); End; t[1]:= '1'; t[2]:= '2'; t[3]:= '3'; t[4]:= '4'; t[5]:= '-'; t[6]:= chr(124); t[7]:= '+'; End; Procedure brway(var k: integer); Var i,u: integer; Begin u:= 0; For i:= 1 to 3 do if a[cx,cy] = t[h[k,i]] then Begin u:= h[k,i]; break; End; If u = 0 then If a[cx,cy] <> '+' then Begin check:= false; exit; End else Begin cx:= cx + dx[k]; cy:= cy + dy[k]; exit; End; For i:= 1 to 2 do if k = d[u,i,1] then Begin k:= d[u,i,2]; cx:= cx + dx[k]; cy:= cy + dy[k]; break; End; End; Function tk: boolean; Begin tk:= ((cx = fx) and (cy = fy)) or not check; End; Function getbr(k: integer): integer; Var i,u: integer; tx,ty,tmp,tmpcount: integer; Begin tx:= cx; ty:= cy; For i:= 1 to 3 do Begin cx:= tx; cy:= ty; check:= true; u:= h[k,i]; a[cx,cy]:= t[u]; tmp:= k; tmpcount:= count; Repeat brway(tmp); If not tk then dec(tmpcount); Until ((cx = fx) and (cy = fy)) or not check; If (cx = fx) and (cy = fy) and (tmpcount < 2) then exit(u) else a[tx,ty]:= '.'; End; getbr:= 7; End; Procedure solve; Var f: text; k,i,j: integer; Begin For i:= 1 to r do For j:= 1 to c do If a[i,j] = 'M' then Begin sx:= i; sy:= j; End else if a[i,j] = 'Z' then Begin fx:= i; fy:= j; End; For i:= 1 to 4 do Begin cx:= sx + dx[i]; cy:= sy + dy[i]; If (a[cx,cy] <> '.') and (a[cx,cy] <> 'Z') then Begin k:= i; break; End; End; count:= brnum - 2; Repeat brway(k); If a[cx,cy] <> '.' then dec(count); Until a[cx,cy] = '.'; Assign(f, output); Rewrite(f); Write(f, cx, ' ', cy, ' ', t[getbr(k)]); Close(f); End; Begin init; solve; End.
Code mẫu của khuc_tuan
//{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q+,R+,S+,T-,U-,V+,W-,X+,Y+,Z1} // {$APPTYPE CONSOLE} {$mode delphi} const dx : array[0..3] of integer = (-1,0,1,0); dy : array[0..3] of integer = (0,1,0,-1); var z, x, y, h, i, j, m, n : integer; a : array[1..100,0..100] of char; mark : array[1..100,1..100] of integer; data : array[Char] of integer; ok : boolean; s : array[0..7] of char = '|-+1234'#0; function inside(x,y : integer) : boolean; begin inside := (x>=1) and (x<=m) and (y>=1) and (y<=n); end; procedure go(x,y,h : integer); var nh, t, s : integer; begin if a[x,y]='.' then begin mark[x,y] := mark[x,y] or (1 shl ((h+2) mod 4)); exit; end; s := 0; for t:=0 to 3 do if (data[a[x,y]] and (1 shl t)) <> 0 then s := s + t; nh := s - (h + 2) mod 4; if a[x,y]='+' then nh := h; go( x + dx[nh], y + dy[nh], nh); end; begin data['|'] := 1 or 4; data['-'] := 2 or 8; data['+'] := 1 or 2 or 4 or 8; data['1'] := 2 or 4; data['2'] := 1 or 2; data['3'] := 1 or 8; data['4'] := 4 or 8; readln(m,n); for i:=1 to m do begin readln(a[i]); move(a[i][0], a[i][1], 50); end; for i:=1 to m do for j:=1 to n do if (a[i,j]='M') or (a[i,j]='Z') then begin ok := false; for h:=0 to 3 do begin x := i + dx[h]; y := j + dy[h]; if inside(x,y) and (a[x,y]<>'.') and ((data[a[x,y]] and (1 shl ((h+2) mod 4)))<>0)then begin ok := true; go(x,y,h); end; end; if not ok then begin for h:=0 to 3 do begin x := i + dx[h]; y := j + dy[h]; if inside(x,y) and (a[x,y]='.') then mark[x,y] := mark[x,y] or (1 shl ((h+2) mod 4)); end; end; end; for i:=1 to m do for j:=1 to n do for z:=0 to 6 do if mark[i,j] = data[s[z]] then begin ok := false; for h:=0 to 3 do if (mark[i,j] and (1 shl h)) = 0 then begin x := i + dx[h]; y := j + dy[h]; if inside(x,y) and (not (a[x,y] in ['Z','M','.'])) and ((data[a[x,y]] and (1 shl((h+2) mod 4)))<>0) then ok := true; end; if ok then writeln(i,#32,j,#32,'+') else writeln(i,#32,j,#32,s[z]); exit; end; end.
Bình luận