Guest User

Untitled

a guest
Jan 23rd, 2018
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.25 KB | None | 0 0
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils;
  7.  
  8. var
  9.   N, M, i, j, sveti, svetj: integer;
  10.   Lab: array[1..1000,1..1000] of Char;
  11.  
  12. procedure svet_go(i, j, di, dj: integer);
  13. var
  14.   curi, curj: integer;
  15. begin
  16. //curi - текущая строка
  17. //curj - текущий столбец
  18. //di - шаг по строкам (+1 - вниз, -1 - вверх)
  19. //dj - шаг по столбцам (+1 - вправо, -1 - влево
  20.  
  21. //проверяем условие:
  22. //(not ((Lab[i+di, j]='*') and (Lab[i, j+dj]='*'))) - луч не упёрся в две звездочки по диагонали
  23. //... *.
  24. //... /*
  25. //луч не должен их проходить(по условию)
  26. //
  27. //(((i+di>0) and (i+di<N+1)) or ((j+dj>0) and (j+dj<M+1)))
  28. //луч не уперся в угол (упираясь в угол луч дальше не идёт)
  29. 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
  30.   begin
  31.   //если луч уперся в горизонтальную границу - он отражается
  32.   if (i+di>0) and (i+di<N+1) then curi:=i+di else begin curi:=i; di:=-di; end;
  33.   //если луч уперся в вертикальную границу - он отражается
  34.   if (j+dj>0) and (j+dj<M+1) then curj:=j+dj else begin curj:=j; dj:=-dj; end;
  35.   //если при отражении луч не попал в зеркальную стену - он идёт дальше
  36.   //если при отражении луч попадёт в X - светофор либо перекрестие лучей - он дальше не идёт (так как картина его пути уже прорисована)
  37.   if (Lab[curi, curj]<>'*') and (Lab[curi, curj]<>'X') then
  38.         begin
  39.         //прорисовываем луч и запускаем процедуру заново для текущих координат
  40.         if (di*dj>0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='\';
  41.         if (di*dj>0) and (Lab[curi, curj]='/') then Lab[curi, curj]:='X';
  42.         if (di*dj<0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='/';
  43.         if (di*dj<0) and (Lab[curi, curj]='\') then Lab[curi, curj]:='X';
  44.         svet_go(curi, curj, di, dj);
  45.         end;
  46.   //если луч уперся в зеркальную стену
  47.   if Lab[curi, curj]='*' then begin
  48.                               //если луч уперся в вертикальную зеркальную стену (проверяем, что это не зеркальный угол)
  49.                               if (Lab[curi-di, curj]='*')  and (Lab[curi, curj-dj]<>'*') then
  50.                                   begin
  51.                                   curj:=curj-dj;
  52.                                   dj:=-dj;
  53.                                   if (di*dj>0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='\';
  54.                                   if (di*dj>0) and (Lab[curi, curj]='/') then Lab[curi, curj]:='X';
  55.                                   if (di*dj<0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='/';
  56.                                   if (di*dj<0) and (Lab[curi, curj]='\') then Lab[curi, curj]:='X';
  57.                                   svet_go(curi, curj, di, dj);
  58.                                   end;
  59.                               //если луч уперся в горизонтальную зеркальную стену (проверяем, что это не зеркальный угол)
  60.                               if (Lab[curi-di, curj]<>'*') and (Lab[curi, curj-dj]='*') then
  61.                                   begin
  62.                                   curi:=curi-di;
  63.                                   di:=-di;
  64.                                   if (di*dj>0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='\';
  65.                                   if (di*dj>0) and (Lab[curi, curj]='/') then Lab[curi, curj]:='X';
  66.                                   if (di*dj<0) and (Lab[curi, curj]='.') then Lab[curi, curj]:='/';
  67.                                   if (di*dj<0) and (Lab[curi, curj]='\') then Lab[curi, curj]:='X';
  68.                                   svet_go(curi, curj, di, dj);
  69.                                   end;
  70.                               end;
  71.   end;
  72.  
  73. end;
  74.  
  75. begin
  76.  
  77. //Считываем данные
  78. readln(N, M);
  79. for i:=1 to N do for j:=1 to M do begin
  80.                                   if j<>M then read(Lab[i,j]) else readln(Lab[i,j]);
  81.                                   //Ищем светофор - проверяем, его ли мы сейчас считали
  82.                   if Lab[i,j]='X' then begin
  83.                                                        sveti:=i;
  84.                                                        svetj:=j;
  85.                                                        end;
  86.                                   end;
  87.  
  88. //Запускаем луч от светофора вниз вправо
  89. svet_go(sveti, svetj, 1, 1);
  90. //Луч вниз влево
  91. svet_go(sveti, svetj, 1, -1);
  92. //Луч вверх вправо
  93. svet_go(sveti, svetj, -1, 1);
  94. //Луч вверх влево
  95. svet_go(sveti, svetj, -1, -1);
  96.  
  97.  
  98. writeln;
  99. //Вывод картинки
  100. 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]);
  101.  
  102. readln;
  103. end.
Add Comment
Please, Sign In to add comment