Advertisement
dmkozyrev

chess_n

Nov 15th, 2015
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 6.08 KB | None | 0 0
  1. %{
  2.     Задание:
  3.       Робот на поле без перегородок .
  4.       Требуется закрасить поле клетками в шахматном порядке размером NxN .
  5.    
  6.     Идея для решения :
  7.       Научим робота ходить сразу N клеток , маркировать сразу N клеток и
  8.       проходить сразу N столбцов/строк . Тогда мы сведем эту задачу к просто
  9.       " закрасить поле в шахматном порядке " .
  10.      
  11.       Бежим в выбранный нами угол и начинаем перемещаться по нашим
  12.       " большим " столбцам/строкам ( шириной N ) с чередованием замаркированных
  13.       и незамаркированных клеток .
  14.      
  15.     Решение универсально , поэтому вместо " столбцы " и " строки " будем
  16.     говорить " путь "
  17. %}
  18.  
  19.  
  20.  
  21. function chess_n(r, u, v, n)
  22. % Данная функция закрашивает поле без перегородок в шахматном порядке клетками
  23. % NxN начиная от угла по направлению (u, v)
  24. % Пример вызова функции: chess_n(r, 's', 'w', 3);
  25.  
  26. % Первым делом идём в угол
  27.   go_to_wall(r, u); % Идём роботом до ближайшей стены по направлению u
  28.   go_to_wall(r, v); % А теперь то же самое по направлению v
  29.  
  30. % Разворачиваем робота  
  31.   u = invert(u); % меняем направление u на противоположное
  32.   v = invert(v); % то же самое с направлением v
  33.  
  34. % Начинаем красить поле  
  35.  
  36. % Вводим логическую переменную finished , которая будет хранить
  37. % true тогда , когда робот выполнил свою работу полностью
  38.   finished = false;
  39.  
  40. % Вводим логическую переменную mark , которая будет хранить
  41. % true тогда , когда нам нужно начать маркировать с самой первой
  42. % клетки (без смещения)
  43.   mark = true;
  44.  
  45.   while ~finished
  46.     % Красим путь шириной n ( то есть , как пример , если робот
  47.     % движется по слобцам , то мы красим сразу n столбцов ! )
  48.     finished = mark_full_path(r, u, v, n, mark);
  49.     % Обеспечиваем чередование клеток , меняя значение mark на противположное
  50.     mark = ~mark;
  51.   end
  52.  
  53. end
  54.  
  55. function result = invert(u)
  56. % Функция возвращает противоположное к направлению u
  57.   switch u
  58.     case 'w' result = 'o';
  59.     case 'o' result = 'w';
  60.     case 'n' result = 's';
  61.     case 's' result = 'n';
  62.   end
  63. end
  64.  
  65. function go_to_wall(r, u)
  66. % Функция перемещает робота вполную к ближайшей стене по направлению u
  67.   while ~r.is_bord(u)
  68.     r.step(u);
  69.   end
  70. end
  71.  
  72. function result = mark_full_path(r, u, v, n, mark)
  73. % Функция маркирует полный путь , то есть путь , состоящий из n одинарных путей
  74. % Принимает в качестве параметров:
  75. %   направления u и v ,
  76. %   ширину клетки n
  77. %   mark = true , если нужно закрашивать первую клетку , иначе false
  78.  
  79. % Возвращает true , если при смещении по направлению v ( переход
  80. % на следующий одинарный путь ) робот уперся в стену
  81.   result = false;
  82.   for i = 1:n
  83.     mark_small_path(r, u, n, mark); % Закрашиваем одинарный путь
  84.     go_to_wall(r, invert(u)); % Возвращаемся обратно
  85.     if ~r.is_bord(v) % Если по направлению смещения нет стены
  86.       r.step(v); % То смещаемся на новый одинарный путь
  87.     else
  88.       result = true; % Наткнулить на стену
  89.       break; % Прекращаем работу цикла
  90.     end
  91.   end
  92. end
  93.  
  94. function mark_small_path(r, u, n, mark)
  95. % Функция гонит робота по направлению u следующим образом:
  96. % n клеток закрашиваются
  97. % n клеток не закрашиваются
  98. % и делает он это до тех пор , пока не упрется в стену
  99. % Если mark = true , то первые n клеток закрашиваются , иначе нет
  100.   wall = false;
  101.  
  102.   while ~wall
  103.     wall = step_n(r, u, n, mark);
  104.     wall = step_n(r, u, n, ~mark);
  105.   end
  106.  
  107. end
  108.  
  109. function result = step_n(r, u, n, mark)
  110. % Функция заставляет робота сделать n шагов по направлению u
  111. % При этом , весь пройденный путь робот закрасит , если mark = true
  112. % Возвращает true , если уперся в стену
  113.   result = false;
  114.  
  115.   for i = 1:n
  116.     % Сначала закрасим клетку , если это нужно :
  117.     if mark && ~r.is_mark
  118.       r.mark;
  119.     end;
  120.     % Затем уже делаем шаг :
  121.     if ~r.is_bord(u) % Если не уткнулись в стену по направдению u
  122.       r.step(u); % То смело щагаем туда
  123.     else % Если все - таки уткнулись в неё
  124.       result = true; % То сообщаем это
  125.       if mark && ~r.is_mark % И закрасим клетку перед выходом , если нужно
  126.         r.mark;
  127.       end;
  128.       break; % Преждевременно завершаем выполнение цикла
  129.     end  
  130.   end
  131. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement