sadomovalex,
«надо» — это сильно. Наверное, правильнее сказать «можно». Но давайте дойдем до конца. Вы доопределили данные (
способами), поделили их на строки/колонки, (
), теперь надо строки и колонки переставлять, не правда ли? Получаем
.
Я бы хотел предложить следующую терминологию:
«строка» и
«колонка» относятся к матрице, а то, что мы читаем из файла входа, называть
«кортеж» (он может оказаться и строкой, и колонкой).
«строколонка» это либо строка, либо колонка (их удобно рассматривать вместе и нумеровать, например, 1..N строки, N+1..2N колонки). Таким образом, нам надо найти соответствие кортежей и строколонок.
sadomovalex писал(а):
в Вашем методе учитывается, что строки могут стоять на разных местах?
Мы храним множество (номеров) неназначенных строколонок (первоначально — все строколонки), и для каждой строколонки храним множество (номеров) кортежей, которые в ней могут быть (первоначально — все кортежи).
Кроме того, мы не пытаемся угадывать, чему равны двойки. Скорее мы рассматриваем кортежи как сопоставление с регулярным выражением (а двойки — как вайлдкард). Поэтому в некоторых конфигурациях двойки остаются в ответе: значение в матрице не определено.
Код:
5 6 3 X 1
4 1 1 1 1 0
8 2 2 1 0 1
9 1 1 0 0 1
7 0 0 0 1 1
2 1 1 1 0 0
Для больших задач можно было бы попробовать пару оптимизаций: (а) кодирование кортежей (
,
,
), тогда сопоставление превращается в
, и (б) вычисление совместимости кортежей до начала перебора (
, по скорости и памяти, зато уходит цикл в переборе).
Еще одна забавная (и очень дешевая) оптимизация связана с тем, что все решения симметричны относительно транспонирования. Поэтому заметную часть перебора можно исключить, запретив первый кортеж в колонках (разрешив его только в строках). Мелочишка, а приятно…