Matlab 171 байт
Входные данные должны быть двухмерной матрицей, поэтому вы должны называть ее так c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(точки с запятой начинаются с новой строки). Эта функция просто перебирает все возможные ходы, поэтому мы получаем время выполнения O(2^(n^2))
.
Как это делается
Это делается путем выбора всех возможных способов заполнения другой матрицы того же размера единицами и нулями, это в основном считается в двоичном формате, где каждая запись матрицы представляет определенную степень 2.
Затем мы выполняем ходы для тех ячеек, которые равны 1, это делается суммой (mod 2) двух двумерной свертки с вектором размером 1xn и nx1.
Наконец, мы решаем, действительно ли эти перемещения дали желаемый результат, вычисляя стандартное отклонение для всех записей. Стандартное отклонение составляет только нули, если все записи одинаковы. И всякий раз, когда мы на самом деле нашли желаемый результат, мы сравниваем его с количеством ходов предыдущих решений. Функция вернется, inf
если данная проблема не разрешима.
Math?
На самом деле стоит отметить, что все эти шаги вместе создают абелеву группу! Если кому-то действительно удастся оценить эти группы, пожалуйста, дайте мне знать.
Гольф версия:
function M=c(a);n=numel(a);p=a;M=inf;o=ones(1,n);for k=0:2^n-1;p(:)=dec2bin(k,n)-'0';b=mod(conv2(p,o,'s')+conv2(p,o','s'),2);m=sum(p(:));if ~std(b(:)-a(:))&m<M;M=m;end;end
Полная версия (с выводом актуальных ходов.)
function M = c(a)
n=numel(a);
p=a;
M=inf; %current minimum of number of moves
o=ones(1,n);
for k=0:2^n-1;
p(:) = dec2bin(k,n)-'0'; %logical array with 1 where we perform moves
b=mod(conv2(p,o,'same')+conv2(p,o','same'),2); %perform the actual moves
m=sum(p(:)); %number of moves;
if ~std(b(:)-a(:))&m<M %check if the result of the moves is valid, and better
M=m;
disp('found new minimum:')
disp(M) %display number of moves of the new best solution (not in the golfed version)
disp(p) %display the moves of the new best solution (not in the golfed version)
end
end
1000
(переставляется как квадрат, неважно, как).