Обход в глубину(100 задач)
Способы задания графа(54 задач)
Минимальный каркас(12 задач)
Потоки(21 задач)
Паросочетания(17 задач)
Эйлеров цикл(9 задач)
Деревья(16 задач)
Переведите каждого из двух коней из одной клетки в другую за наименьшее общее число ходов. Два коня не могут одновременно находиться в одной клетке. Ходы коней должны чередоваться.
Во входном файле записаны координаты первого и второго коня, затем координаты клеток, куда нужно их переместить.
Программа должна вывести последовательность ходов коней в виде нескольких строк. Первым символом в строке должен быть номер коня (1 или 2), затем, через пробел, координаты клетки, в которую он переставляется. Необходимо вывести любое из возможных оптимальных решений. Кони должны ходить по очереди, первым может ходить любой из коней, кони могут сделать различное число ходов.
a1 c2 c2 a1
1 b3 2 a1 1 d4 2 b3 1 c2 2 a1
Компания, в которой все ещё работает ваш друг, решила выпустить новую игру для мобильных телефонов, чтобы пассажирам было не так скучно стоять в пробках. Зная вас как хорошего программиста, вам поручили написать основную часть этой игры.
Игра будет состоять в том, что игрок будет управлять автобусом, перемещающимся по городу. В первой версии игры город будет представлять собой прямоугольное поле размера \(N\times M\) клеток, каждая из которых либо занята зданием, либо свободна (т.е. по ней проходит дорога). Автобус игрока может перемещаться лишь по дорогам, но не по зданиям.
Кроме того, автобус считается достаточно большим, настолько, что он не может разворачиваться в~пределах одной клетки. Правда, вам пока не хочется учитывать конкретные размеры автобуса, поэтому для простоты игроку будет запрещено делать два хода подряд в противоположных направлениях, а любые другие маневры будут разрешены.
Таким образом, каждым очередным ходом игрок может переместить автобус на любую соседнюю по стороне свободную клетку, кроме той, с которой автобус только что приехал. (Первым ходом можно переместить автобус в любую сторону.)
В результате понятно, что автобус игрока может застрять в тупике, откуда ему будет некуда двигаться. Более того, ясно, что есть клетки, куда заезжать нельзя, т.к., заехав туда, в итоге игрок будет вынужден доехать до тупика.
Строго говоря, пусть игрок перемещает автобус бесконечно долго (т.е. в течение бесконечного количества ходов). Тогда несложно видеть, что в некоторых свободных клетках игрок может бывать бесконечно много раз (при условии, что начальная клетка выбрана удачно), а в некоторых — не более одного (и то лишь в начальной части игры).
Сейчас вы хотите написать программу, которая разделит все свободные клетки поля на эти два типа.
На первой строке входного файла находятся два числа \(N\) и \(M\) — количество
строк и столбцов игрового поля соответственно (\(1\leq N, M\leq 500\)). Далее следуют \(N\) строк, описывающих поле.
В каждой строке находятся ровно \(M\) символов, каждый из которых может быть или
“#
” (решётка, ASCII-код 35), или “.
” (точка). Решётка
обозначает клетку со зданием, точка — свободную клетку.
В выходной файл выведите \(N\) строк по \(M\) символов в каждой: для клеток, в
которых находятся здания, выводите “#
”, для клеток, где игрок может побывать не более одного раза —
“X
” (латинская заглавная буква X), для остальных клеток —
“.
”.
Если ваша программа будет работать при \(N,M\leq 100\), то вы получите как минимум 50 баллов.
Если ваша программа будет работать при \(N,M\leq 250\), то вы получите как минимум 60 баллов.
4 12 .#....#.##.. .##.#.#.##.. ......####.. .##.#.#.####
X#X...#X##.. X##.#.#X##.. XXX...####.. X##X#X#X####
3 2 ## ## ##
## ## ##
В Якутске \(n\) домов. Некоторые из них соединены дорогами с односторонним движением.
В последнее время в Якутске участились случаи пожаров. В связи с этим жители решили построить в городе несколько пожарных станций. Но возникла проблема: едущая по вызову пожарная машина, конечно, может игнорировать направление движения текущей дороги, однако возвращающаяся с задания машина обязана следовать правилам дорожного движения (жители Якутска свято чтут эти правила!).
Ясно, что, где бы ни оказалась пожарная машина, у нее должна быть возможность вернуться на ту пожарную станцию, с которой выехала. Но строительство станций стоит больших денег, поэтому на совете города было решено построить минимальное количество станций таким образом, чтобы это условие выполнялось. Кроме того, для экономии было решено строить станции в виде пристроек к уже существующим домам.
Ваша задача — написать программу, рассчитывающую оптимальное положение станций.
В первой строке входного файла задано число \(n\) (\(1 \le n \le 3\,000\)). Во второй строке записано количество дорог \(m\) (\(1 \le m \le 100\,000\)). Далее следует описание дорог в формате \(a_i\) \(b_i\), означающее, что по \(i\)-й дороге разрешается движение автотранспорта от дома \(a_i\) к дому \(b_i\) (\(1 \le a_i, b_i \le n\)).
В первой строке выведите минимальное количество пожарных станций \(K\), которые необходимо построить. Во второй строке выведите \(K\) чисел в произвольном порядке — дома, к которым необходимо пристроить станции. Если оптимальных решений несколько, выведите любое.
5 7 1 2 2 3 3 1 2 1 2 3 3 4 2 5
2 5 4
В секретном 240 отделе ИПФ РАН \(N\) сотрудников и \(N\) компьютеров. В отделе вводятся новые требования к секретности. В соответствии с этими требованиями, для каждого сотрудника будут определены ровно \(K\) компьютеров, к которым этот сотрудник будет иметь допуск (т.е. за которыми этот сотрудник будет иметь право работать), причём так, что к каждому компьютеру будут иметь допуск ровно \(K\) сотрудников.
Информация о том, какой сотрудник к какому компьютеру будет иметь допуск, будет известна лишь непосредственно перед вступлением новых требований в силу. Таким образом, чтобы не прерывать работу отдела, сотрудники должны будут быстро решить, кто за каким компьютером будет работать. Для этого им необходимо заранее написать программу, которая по любому распределению допусков сотрудников найдёт рассадку сотрудников по компьютерам, удовлетворяющую этим допускам.
Обратите внимание, что значение \(K\) тоже будет известно лишь в последний момент. Из общих соображений секретности известно лишь, что \(K\) будет равняться или 1, или 2, или 4; поэтому ваша программа должна уметь работать для любого из этих трех значений \(K\).
В первой строке входного файла записаны натуральные числа \(N\) и \(K\) (\(1\leq N \leq 500\)). Далее следуют \(KN\) строк, в каждой из которых записаны два натуральных числа — номер сотрудника и номер компьютера, к которому этот сотрудник имеет допуск.
Гарантируется, что каждый сотрудник имеет допуск ровно к \(K\) компьютерам, что к каждому компьютеру ровно \(K\) сотрудников имеют допуск, и что \(K\) равно либо 1, либо 2, либо 4.
В выходной файл выведите \(N\) строк, в каждой по два числа — номер сотрудника и номер компьютера, за которым он должен работать. Строки можно выводить в произвольном порядке.
Если есть несколько решений, выведите любое. Можно доказать, что для любого входного файла, удовлетворяющего указанным ограничениям, всегда имеется как минимум одно решение.
3 1 2 3 3 1 1 2
3 1 1 2 2 3
2 2 1 2 2 1 2 2 1 1
1 2 2 1
Митя знаком с \(m\) юношами и \(n\) девушками и хочет пригласить часть из них на свой день рождения. Ему известно, с какими девушками знаком каждый юноша, и с какими юношами знакома каждая девушка. Он хочет добиться того, чтобы каждый приглашённый был знаком со всеми приглашёнными противоположного пола, пригласив при этом максимально возможное число своих знакомых.
Входной файл состоит из одного или нескольких наборов входных данных. В первой строке входного файла записано число наборов \(k\) (\(1\le k\le 20\)). В последующих строках записаны сами наборы входных данных. В первой строке каждого набора задаются числа \(0\le m\le 150\) и \(0\le n\le 150\). Далее следуют \(m\) строк, в каждой из которых записано одно или несколько чисел — номера девушек, с которыми знаком \(i\)-й юноша (каждый номер встречается не более одного раза). Строка завершается числом 0.
Для каждого набора выведите четыре строки. В первой из них выведите максимальное число знакомых, которых сможет пригласить Митя. В следующей строке выведите количество юношей и количество девушек в максимальном наборе знакомых. Следующие две строки должны содержать номера приглашённых юношей и приглашённых девушек соответственно. Если максимальных наборов несколько, то выведите любой из них.
2 2 2 1 2 0 1 2 0 3 2 1 2 0 2 0 1 2 0
4 2 2 1 2 1 2 4 2 2 1 3 1 2