рднреВрд▓рднреБрд▓реИрдпрд╛ рдкрде рдПрд▓реНрдЧреЛрд░рд┐рдердо

рд╢реБрдн рджрд┐рди, рдкреНрд░рд┐рдп рд╕рдореБрджрд╛рдпред

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕



рдПрдХ рдареАрдХ рджрд┐рди, рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдШреВрдордирд╛, рдПрдХ рднреВрд▓рднреБрд▓реИрдпрд╛ рдкрд╛рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдпрд╛, рдореБрдЭреЗ рдЕрднреА рднреА рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рднреВрд▓рднреБрд▓реИрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣реИ:




рдХрд╛рдо рдХрд╛ рджрд┐рди рдЙрдмрд╛рдК рдерд╛, рдореВрдб рдЙрддреНрдХреГрд╖реНрдЯ рдерд╛ред рдПрдХ рд▓рдХреНрд╖реНрдп, рд╕рд╛рдзрди рдФрд░ рдЗрдЪреНрдЫрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдирд┐рд╖реНрдХрд░реНрд╖ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рдо рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред



рдХрд╣рд╛рдиреА



рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреА рдореМрдЬреВрджрд╛ рдЫрд╡рд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ 3 рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:

const WALL=-1; BLANK=-2; DEADBLOCK=-3; 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреА рдЫрд╡рд┐ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рд░рдгреА рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдХрд░ рдФрд░ рд╕рд░рдгреА рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдИ рдЫрд╡рд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реВрдВ:
рдЫрд╡рд┐ рд╕реНрдХреИрди:

 ... var N:integer=600; LABIRINT:array[0..600,0..600] of integer; ... var bit:TBitmap; i,j:integer; begin bit:=TBitmap.Create; If OpenDialog1.Execute then begin bit.LoadFromFile(OpenDialog1.FileName); for i:=0 to N do for j:=0 to N do if bit.Canvas.Pixels[j,i]=clWhite then LABIRINT[j,i]:=BLANK else LABIRINT[j,i]:=WALL; bit.Free; ... end; end; ... 


рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг:

 ... var N:integer=600; LABIRINT:array[0..600,0..600] of integer; ... procedure genBitmap; var bit:TBitmap; i,j:Integer; begin bit:=TBitmap.Create; bit.Width:=N+1; bit.Height:=N+1; for i:=0 to N do for j:=0 to N do begin if LABIRINT[i,j]=BLANK then bit.Canvas.Pixels[i,j]:=clWhite // else if LABIRINT[i,j]=WALL then bit.Canvas.Pixels[i,j]:=clBlack else bit.Canvas.Pixels[i,j]:=clRed; end; bit.SaveToFile('tmp.bmp'); bit.Free; end; ... 




рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдореЛрдиреЛрдХреНрд░реЛрдо рдмреАрдПрдордкреА рдХреЗ рд░реВрдк рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ 2 рд░рдВрдЧ рд╕рдлреЗрдж рдпрд╛ рдХрд╛рд▓реЗ рд╣реЛрдВред рдпрджрд┐ рдЖрдк рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ рджреАрд╡рд╛рд░ 2 рдкрд┐рдХреНрд╕реЗрд▓ рдореЛрдЯреА рдФрд░ рд╕рдбрд╝рдХ 4 рдкрд┐рдХреНрд╕реЗрд▓ рдореЛрдЯреА рд╣реИред рдпрд╣ рджреАрд╡рд╛рд░ рдФрд░ рд╕рдбрд╝рдХ рдХреА рдореЛрдЯрд╛рдИ 1 рдкрд┐рдХреНрд╕реЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЫрд╡рд┐ рдХреЛ 3 рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рдд, рдЪрд┐рддреНрд░ рд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ 2 рдФрд░ 3, рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рдХреЛ рд╣рдЯрд╛ рджреЗрдВ (рдпрд╣ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рдФрд░ рдзреИрд░реНрдп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред

рддреИрдпрд╛рд░ рдЪрд┐рддреНрд░:


рдЫрд╡рд┐ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ: 1802 рдкрд┐рдХреНрд╕реЗрд▓ред



1. рд╣рдо рдЗрдореЗрдЬ рд╕реНрдХреИрдирд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
2. рдЫрд╡рд┐ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:

 ... var N:integer=1801; LABIRINT:array[0..1801,0..1801] of integer; ... procedure rebuildArr2; var i,j:integer; begin for i:=0 to ((N div 3) ) do for j:=0 to ((N div 3) ) do LABIRINT[i,j]:=LABIRINT[i*3,j*3]; N:=N div 3; end; ... 


3. рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдЫрд╡рд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:


рдЫрд╡рд┐ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ: 601 рдкрд┐рдХреНрд╕реЗрд▓ред



рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреА рдПрдХ рдЫрд╡рд┐ рд╣реИ, рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЦреЛрдЬред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рджрд░реНрдЬ рдХреА рдЧрдИ рд╡реИрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА - рджреАрд╡рд╛рд░ рдФрд░ BLANK - рд╕рдбрд╝рдХред

рд▓рд╣рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЗ рдорд╛рд░реНрдЧ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдПрдХ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕ рдерд╛ред рд╕рднреА рдкреНрд░рдпрд╛рд╕реЛрдВ рдореЗрдВ рдЕрд╕рдлрд▓ рдХреНрдпреЛрдВ, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдиреЗ "рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ" рддреНрд░реБрдЯрд┐ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ред рдореБрдЭреЗ 100% рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдорд╛рд░реНрдЧ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдерд╛ред

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рддреБрд░рдВрдд рдирд╣реАрдВ рдЖрдпрд╛, рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрдИ рдЕрд╣рд╕рд╛рд╕ рдереЗ, рдЬреЛ рд╕рдордп рдореЗрдВ рд▓рдЧрднрдЧ 3 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рдереЗ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкреНрд░реЗрд░рдгрд╛ рдЖрдИ: "рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рд░рд╛рд╕реНрддреЛрдВ рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрде рдЬреЛ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреА рдУрд░ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореГрдд рд╕рд┐рд░реЛрдВ рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ"ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рднреВрд▓рднреБрд▓реИрдпрд╛ рд╕рдбрд╝рдХреЛрдВ рдХреЗ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХрд░реЗрдВ:
1. рдпрджрд┐ рд╣рдо рд╕рдбрд╝рдХ рдкрд░ рдЦрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдЪрд╛рд░реЛрдВ рдУрд░ 3 рджреАрд╡рд╛рд░реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рдореГрдд рдЕрдВрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЦрдбрд╝реЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ;
2. рд╣рдо рдЙрд╕ рдЬрдЧрд╣ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдЬреЛ рдмрд┐рдВрджреБ рдирдВрдмрд░ 1 рд╕реЗ рджреАрд╡рд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдмрд┐рдВрджреБ рдирдВрдмрд░ 1 рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ;

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 ... var N:integer=600; LABIRINT:array[0..600,0..600] of integer; ... procedure setBlankAsDeadblockRec(x,y:integer); var k:integer; begin k:=0; if LABIRINT[x,y]=blank then begin if LABIRINT[x-1,y]<>BLANK then k:=k+1; if LABIRINT[x,y-1]<>BLANK then k:=k+1; if LABIRINT[x+1,y]<>BLANK then k:=k+1; if LABIRINT[x,y+1]<>BLANK then k:=k+1; if k=4 then LABIRINT[x,y]:=DEADBLOCK; if k=3 then begin LABIRINT[x,y]:=DEADBLOCK; if LABIRINT[x-1,y]=BLANK then setBlankAsDeadblockRec(x-1,y); if LABIRINT[x,y-1]=BLANK then setBlankAsDeadblockRec(x,y-1); if LABIRINT[x+1,y]=BLANK then setBlankAsDeadblockRec(x+1,y); if LABIRINT[x,y+1]=BLANK then setBlankAsDeadblockRec(x,y+1); end; end; end; procedure setDeadblock; var i,j:integer; begin for i:=1 to N-1 do for j:=1 to N-1 do setBlankAsDeadblockRec(i,j); end; ... 


рдирд┐рд╖реНрдХрд░реНрд╖



рдореБрдЭреЗ рдПрдХ "рдкреВрд░реНрдг" рд╡рд░реНрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдорд┐рд▓рд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЧрддрд┐ рдореЗрдВ рдирд╡реАрдирддрдо рд╕рднреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░ рдЧрдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЫреЛрдЯреЗ рд╕реЗ рдХрд╛рдо рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдирдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдХреНрдХрд╛ рд▓рдЧреЗрдЧрд╛ред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рдФрд░ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛:
 //       . unit Unit1; interface uses Windows, Graphics, Forms, Dialogs, ExtCtrls, StdCtrls, Controls, Classes; const WALL=-1; BLANK=-2; DEADBLOCK=-3; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; N:integer=600; LABIRINT:array[0..600,0..600] of integer; implementation {$R *.dfm} procedure genBitmap; var bit:TBitmap; i,j:Integer; begin bit:=TBitmap.Create; bit.Width:=N+1; bit.Height:=N+1; for i:=0 to N do for j:=0 to N do begin if LABIRINT[i,j]=BLANK then bit.Canvas.Pixels[i,j]:=clWhite // else if LABIRINT[i,j]=WALL then bit.Canvas.Pixels[i,j]:=clBlack else bit.Canvas.Pixels[i,j]:=clRed; end; bit.SaveToFile('tmp.bmp'); bit.Free; end; procedure rebuildArr2; var i,j:integer; begin for i:=0 to ((N div 3) ) do for j:=0 to ((N div 3) ) do LABIRINT[i,j]:=LABIRINT[i*3,j*3]; N:=N div 3; end; procedure setBlankAsDeadblockRec(x,y:integer); var k:integer; begin k:=0; if LABIRINT[x,y]=blank then begin if LABIRINT[x-1,y]<>BLANK then k:=k+1; if LABIRINT[x,y-1]<>BLANK then k:=k+1; if LABIRINT[x+1,y]<>BLANK then k:=k+1; if LABIRINT[x,y+1]<>BLANK then k:=k+1; if k=4 then LABIRINT[x,y]:=DEADBLOCK; if k=3 then begin LABIRINT[x,y]:=DEADBLOCK; if LABIRINT[x-1,y]=BLANK then setBlankAsDeadblockRec(x-1,y); if LABIRINT[x,y-1]=BLANK then setBlankAsDeadblockRec(x,y-1); if LABIRINT[x+1,y]=BLANK then setBlankAsDeadblockRec(x+1,y); if LABIRINT[x,y+1]=BLANK then setBlankAsDeadblockRec(x,y+1); end; end; end; procedure setDeadblock; var i,j:integer; begin for i:=1 to N-1 do for j:=1 to N-1 do setBlankAsDeadblockRec(i,j); end; procedure TForm1.Button1Click(Sender: TObject); var bit:TBitmap; i,j:integer; begin bit:=TBitmap.Create; If OpenDialog1.Execute then begin bit.LoadFromFile(OpenDialog1.FileName); for i:=0 to N do for j:=0 to N do if bit.Canvas.Pixels[j,i]=clWhite then LABIRINT[j,i]:=BLANK else LABIRINT[j,i]:=WALL; bit.Free; setDeadblock; genBitmap; end; end; end. 






рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд╣рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдкрд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рднреВрд▓рднреБрд▓реИрдпрд╛ рдЪрдХреНрд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рдпрд╣ рд╕реБрдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдмрдбрд╝реЗ рднреВрд▓рднреБрд▓реИрдпрд╛ рдореЗрдВ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

Source: https://habr.com/ru/post/In198266/


All Articles