воскресенье, 27 декабря 2009 г.

Train 1.2 (19Dec2009) – Очередь(Поиск в ширину)

На прошлом занятии мы рассмотрели структуру данных Стек, а также одно из его применений на примере поиска в глубину. Сегодня обратим свое внимание в сторону такой структуры данных, как Очередь. Как и раньше на текущем этапе мы не будем разбирать внутреннюю реализацию очереди, а рассмотрим уже готовую STL-скую. Справочную информацию можно почитать здесь.

Одним из самых ярких применений очереди можно пронаблюдать на примере алгоритма Поиска в ширину (BFS).

Задача "Путешествие шахматного коня" (Поиск в ширину)
Технические моменты:
Для того, чтобы было удобно перебирать все соседние клетки, достижимые из текущей, шагом коня, предлагаю воспользоваться массивом движений:

  1. int moveX[8] = {-2,-2,-1,-1,1,1,2,2};
  2. int moveY[8] = {-1,1,-2,2,-2,2,-1,1};

Основная идея:
Рассмотрим работу поиска в ширину пошагово на основе тестового примера (A5 C2). Для более удобного представления шахматной доски в виде матрицы будет считать буквенную часть координаты номером строки, а числовую – номером столбца.

Увеличение размера системного стека

По умолчанию размер системного стека равен 1 или 2 Мб. Если в программе используется глубокая рекурсия, которая требует памяти больше чем значение по умолчанию, тогда нужно указать явным образом размер системного стека в байтах. Это можно сделать с помощью следующей команды, которую нужно указать в самом начале программы:

#pragma comment (linker, "/STACK:64000000")

В данном примере под системный стек будет выделено 64000000/1024/1024 Мб = 61.035 Мб

суббота, 26 декабря 2009 г.

Train 1.1. (12Dec2009) – Стек (Поиск в глубину)

Итак приступим. На текущий момент нам необходимо знать и понимать что такое стек и какой базовый набор операций он поддерживает. О стеке я впервые узнал из этой книги 2004 года издания.  Сейчас мы не будем разбирать внутреннюю реализацию стека, а воспользуемся готовой STL-вской. Здесь можно получить всю справочную информацию по этому вопросу.

Задача  “Скобки”
Глоссарий:
Стек: stack<char> s
Вершина стека: s.top()
Открывающая скобка: ‘(’, ‘{’, ‘[’
Закрывающая скобка:  ‘)’, ‘}’, ‘]’ 
Парные скобки: интуитивно понятно


Основная идея:
Последовательно перебираем символы в строке и действуем по следующему принципу:

Русские буквы на dl.gsu.by

Для решения задач использую Visual Studio 2005, компилятор C++ 9.0. Во время решения столкнулся с проблемой вывода русских букв. Первый раз это произошло в задаче “О скобках”, где нужно было вывести “Да” или “Нет” в качестве ответа.
Проблема заключается в том, что для проверяющей системы выходные файлы должны быть в кодировке CP886(DOS). Из проблемы вышел таким образом

  1. ...
  2. using namespace std;
  3. ...
  4. void output(bool value)
  5. {
  6.     locale rus("rus_rus.866");
  7.     wcout.imbue(rus);
  8.     if (value)
  9.         wcout<<L"Да";
  10.     else
  11.         wcout<<L"Нет";
  12.     exit(0);
  13. }
  14.  

Долинский TRAINS (part 1)

В ближайшее время мы разберем темы представленные в вводном курсе по олимпиадному программированию от Михаила Долинского. (Книга).

Список справочных материалов:

Русские буквы на dl.gsu.by
Увеличение размера системного стека
Малая автоматизация тестирования


Список тренировок:

Train 1.1. (12Dec2009) – Стек (Поиск в глубину)
Train 1.2 (19Dec2009) – Очередь(Поиск в ширину)