Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Project1;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- var
- N, M, i, j, sveti, svetj: integer;
- Lab: array[1..1000,1..1000] of Char;
- procedure svet_go(i, j, di, dj: integer);
- var
- curi, curj: integer;
- begin
- //curi - текущая строка
- //curj - текущий столбец
- //di - шаг по строкам (+1 - вниз, -1 - вверх)
- //dj - шаг по столбцам (+1 - вправо, -1 - влево
- //проверяем условие:
- //(not ((Lab[i+di, j]='*') and (Lab[i, j+dj]='*'))) - луч не упёрся в две звездочки по диагонали
- //... *.
- //... /*
- //луч не должен их проходить(по условию)
- //
- //(((i+di>0) and (i+di<N+1)) or ((j+dj>0) and (j+dj<M+1)))
- //луч не уперся в угол (упираясь в угол луч дальше не идёт)
- if (not ((Lab[i+di, j]='*') and (Lab[i, j+dj]='*'))) and (((i+di>0) and (i+di<N+1)) or ((j+dj>0) and (j+dj<M+1))) then
- begin
- //если луч уперся в горизонтальную границу - он отражается
- if (i+di>0) and (i+di<N+1) then curi:=i+di else begin curi:=i; di:=-di; end;
- //если луч уперся в вертикальную границу - он отражается
- if (j+dj>0) and (j+dj<M+1) then curj:=j+dj else begin curj:=j; dj:=-dj; end;
- //если при отражении луч не попал в зеркальную стену - он идёт дальше
- //если при отражении луч попадёт в X - светофор либо перекрестие лучей - он дальше не идёт (так как картина его пути уже прорисована)
- if (Lab[curi, curj]<>'*') and (Lab[curi, curj]<>'X') then
- begin
- //прорисовываем луч и запускаем процедуру заново для текущих координат
- if (di*dj>0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='\';
- if (di*dj>0) and (Lab[curi, curj]='/') then Lab[curi, curj]:='X';
- if (di*dj<0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='/';
- if (di*dj<0) and (Lab[curi, curj]='\') then Lab[curi, curj]:='X';
- svet_go(curi, curj, di, dj);
- end;
- //если луч уперся в зеркальную стену
- if Lab[curi, curj]='*' then begin
- //если луч уперся в вертикальную зеркальную стену (проверяем, что это не зеркальный угол)
- if (Lab[curi-di, curj]='*') and (Lab[curi, curj-dj]<>'*') then
- begin
- curj:=curj-dj;
- dj:=-dj;
- if (di*dj>0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='\';
- if (di*dj>0) and (Lab[curi, curj]='/') then Lab[curi, curj]:='X';
- if (di*dj<0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='/';
- if (di*dj<0) and (Lab[curi, curj]='\') then Lab[curi, curj]:='X';
- svet_go(curi, curj, di, dj);
- end;
- //если луч уперся в горизонтальную зеркальную стену (проверяем, что это не зеркальный угол)
- if (Lab[curi-di, curj]<>'*') and (Lab[curi, curj-dj]='*') then
- begin
- curi:=curi-di;
- di:=-di;
- if (di*dj>0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='\';
- if (di*dj>0) and (Lab[curi, curj]='/') then Lab[curi, curj]:='X';
- if (di*dj<0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='/';
- if (di*dj<0) and (Lab[curi, curj]='\') then Lab[curi, curj]:='X';
- svet_go(curi, curj, di, dj);
- end;
- end;
- end;
- end;
- begin
- //Считываем данные
- readln(N, M);
- for i:=1 to N do for j:=1 to M do begin
- if j<>M then read(Lab[i,j]) else readln(Lab[i,j]);
- //Ищем светофор - проверяем, его ли мы сейчас считали
- if Lab[i,j]='X' then begin
- sveti:=i;
- svetj:=j;
- end;
- end;
- //Запускаем луч от светофора вниз вправо
- svet_go(sveti, svetj, 1, 1);
- //Луч вниз влево
- svet_go(sveti, svetj, 1, -1);
- //Луч вверх вправо
- svet_go(sveti, svetj, -1, 1);
- //Луч вверх влево
- svet_go(sveti, svetj, -1, -1);
- writeln;
- //Вывод картинки
- for i:=1 to N do for j:=1 to M do if j<>M then write(Lab[i,j]) else writeln(Lab[i,j]);
- readln;
- end.
Add Comment
Please, Sign In to add comment