Какие-то аццкие ограничения. Обычно такая задача дается, когда можно перекладывать на любой шпиндель. Особенно дикие ограничения для шпинделей 2-7. Там точно можно только на 2 соседних (по одному слева и справа) перекладывать?
В таком виде длинная цепь из промежуточных шпинделей вообще не влияет на алгоритм. Будь их хоть 100 - все, что вы можете с ними делать - это перекладывать диск с одного конца до другого, а там уже решать задачу для 3-х шпинделей.
rastr, помимо проверки на квадратность, возможно в графе запрещены петли. Тогда надо проверить, что по диагонали стоят 0. А так, ваш код выглядит правильным.
не зная самый минимальный Вы не можете найти второй после минимального.
soloveid, Можно решить и за один проход. Достаточно поддерживать минимальный и второй минимальный элементы. Потом каждый новый элемент может вытеснить или второй минимальный, или самый минимальный (при этом вытесненное значение вытесняет второй минимальный). Грубо говоря добавляете новый элемент к текущим двум минимальным и выкидываете худший из трех. Сокращается до 2 условий:
Если нужны именно разные значения, то надо добавить условие во второй if.
понятно что в 2 прохода это смерть.
LoliDeveloper, Один проход, 2 прохода - разницы практически нет. Экономите только инкремент индекса и условие конца цикла. А тела циклов можно хоть вместе, хоть последовательно выполнять - от перестановки слагаемых сумма не меняется.
Раз вам эта задача не кажется очевидной, советую 2 прохода, таки использовать.
LoliDeveloper, Да, если у вас много потоков, то нужно бороться с race conditions всякими. Потому что операционка может прервать каждый поток в любое время и запустить другой поток, и таким образом нарушить все ваши представления о том, как оно работает.
Василий Банников, Нет, тут O(n^2). Если аккуратно подсчитать количество операций сравнения, то их будет что-то порадка N^2/2, потому что там получается сумма N+(N-1)+(N-2)+...+1.