Matlab 171 bajtów
Dane wejściowe powinny być macierzą 2D, więc nazwijmy to tak c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(średniki rozpoczynają nowy wiersz). Ta funkcja po prostu brutalizuje wszystkie możliwe ruchy, więc otrzymujemy czas działania O(2^(n^2))
.
Jak to jest zrobione
Odbywa się to poprzez wybranie wszystkich możliwych sposobów wypełnienia innej macierzy tego samego rozmiaru jednymi i zerami, co w zasadzie liczy się w postaci binarnej, w której każde wejście macierzy reprezentuje pewną potęgę 2.
Następnie wykonujemy ruchy na komórkach, które są 1, odbywa się to poprzez sumę (mod 2) dwuwymiarowego splotu z wektorem o wielkości 1xn i nx1.
Wreszcie decydujemy, czy te ruchy rzeczywiście przyniosły pożądany wynik, obliczając odchylenie standardowe dla wszystkich pozycji. Odchylenie standardowe wynosi tylko zero, jeśli wszystkie wpisy są takie same. I za każdym razem, gdy rzeczywiście znajdujemy pożądany wynik, porównujemy go z liczbą ruchów poprzednich rozwiązań. Funkcja powróciinf
jeśli danego problemu nie da się rozwiązać.
Matematyka?
Warto zauważyć, że wszystkie te ruchy razem tworzą grupę abelową! Jeśli komuś uda się skorygować te grupy, proszę dać mi znać.
Wersja golfowa:
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
Pełna wersja (z danymi wyjściowymi rzeczywistych ruchów.)
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
(Przestawiony na kwadrat, nie ważne jak).