Advertisement
dmkozyrev

mark_krest

Dec 12th, 2015
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.83 KB | None | 0 0
  1. function mark_krest(r)
  2.     for side = 'wons'
  3.         mark_side(r, side);
  4.     end
  5. end
  6.  
  7. function mark_side(r, side)
  8.     count = 0;
  9.     r.mark;
  10.     while around_the_wall(r, rotate_right(side), side)
  11.         r.mark; count = count + 1;
  12.     end
  13.  
  14.     while (count > 0)
  15.         around_the_wall(r, rotate_right(side), invert(side));
  16.         count = count - 1;
  17.     end
  18. end
  19.  
  20. function side = rotate_right(side)
  21.     if (side =='w')
  22.         side = 'n';
  23.     elseif (side =='n')
  24.         side = 'o';
  25.     elseif (side =='o')
  26.         side = 's';
  27.     elseif (side =='s')
  28.         side = 'w';
  29.     end
  30. end
  31.  
  32. function result = around_the_wall(r, u, v)
  33. % Эта функция нужна для обхода стены роботом.
  34. % Ссылка на робота: r
  35. % Направление вдоль стенки: u
  36. % Расположение стенки относительно робота: v
  37. % Возвращает результат: result = true , если стенку удалось обойти
  38. % Робот окажется прямиком за стенкой , если смог обойти
  39. % Робот окажется в исходном положении , если не смог обойти
  40. % Пример вызова : flag = around_the_wall(r, 's', 'o')
  41.  
  42.     count = 0; % Количество сделанных шагов
  43.     while r.is_bord(v) % Пока не найдена дыра в стене
  44.         if ~r.is_bord(u) % Если мы можем сделать шаг вдоль стены
  45.             r.step(u); % Делаем его
  46.             count = count + 1; % Увеличиваем количество сделанных шагов
  47.         else % Иначе выйдем из цикла
  48.             break;
  49.         end
  50.     end
  51.    
  52.     if ~r.is_bord(v) % Если робот перед дырой в стене
  53.         r.step(v); % Шагаем туда
  54.         result = true; % Говорим , что стену удалось обойти
  55.     else % Если робот не нашел брешь в стене
  56.         result = false; % Говорим , что стену не удалось обойти
  57.     end
  58.    
  59.     u = invert(u); % Разворот вдоль стены , чтобы вернуться обратно
  60.    
  61.     while ( count > 0 ) % Пока не вернулись в исходное положение
  62.         r.step(u); % Шагаем по напрвлению к исходному положению
  63.         count = count - 1; % Уменьшаем число необходимых шагов
  64.     end
  65. end
  66.  
  67. function result = invert(u)
  68. % Функция возвращает противоположное к направлению u
  69.   switch u
  70.     case 'w', result = 'o';
  71.     case 'o', result = 'w';
  72.     case 'n', result = 's';
  73.     case 's', result = 'n';
  74.   end
  75. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement