sadomovalex,
«надо» — это сильно. Наверное, правильнее сказать «можно». Но давайте дойдем до конца. Вы доопределили данные (
![$2^N$ $2^N$](https://dxdy-03.korotkov.co.uk/f/6/b/d/6bd87d9e2f456bcede6b5418622a42a682.png)
способами), поделили их на строки/колонки, (
![$C_{2n}^n$ $C_{2n}^n$](https://dxdy-02.korotkov.co.uk/f/1/4/f/14fdad3598e21ee3c8acfae05e85a2d182.png)
), теперь надо строки и колонки переставлять, не правда ли? Получаем
![$2^N (2n)!$ $2^N (2n)!$](https://dxdy-03.korotkov.co.uk/f/2/9/0/2907c78d9858c83d2253c85961f9e41d82.png)
.
Я бы хотел предложить следующую терминологию:
«строка» и
«колонка» относятся к матрице, а то, что мы читаем из файла входа, называть
«кортеж» (он может оказаться и строкой, и колонкой).
«строколонка» это либо строка, либо колонка (их удобно рассматривать вместе и нумеровать, например, 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
Для больших задач можно было бы попробовать пару оптимизаций: (а) кодирование кортежей (
![$0 \to -1$ $0 \to -1$](https://dxdy-01.korotkov.co.uk/f/8/2/1/821e5a63037c03543be3b73cc0ec92e282.png)
,
![$1 \to 1$ $1 \to 1$](https://dxdy-03.korotkov.co.uk/f/2/8/0/280ca3ca67dbb15a2a8a5cc16987c2e582.png)
,
![$2 \to 0$ $2 \to 0$](https://dxdy-01.korotkov.co.uk/f/8/d/1/8d1c4541f8606ecb7f8c61ec5a8751f282.png)
), тогда сопоставление превращается в
![$ a * b \geqslant 0 $ $ a * b \geqslant 0 $](https://dxdy-02.korotkov.co.uk/f/1/5/5/155768a0607d5c822a9370aed4ea2cff82.png)
, и (б) вычисление совместимости кортежей до начала перебора (
![$\Theta(N^4)$ $\Theta(N^4)$](https://dxdy-04.korotkov.co.uk/f/3/9/a/39aec1349fa07d68ebb7d5d7d3616b8782.png)
, по скорости и памяти, зато уходит цикл в переборе).
Еще одна забавная (и очень дешевая) оптимизация связана с тем, что все решения симметричны относительно транспонирования. Поэтому заметную часть перебора можно исключить, запретив первый кортеж в колонках (разрешив его только в строках). Мелочишка, а приятно…