Matlab 171 Bytes
Die Eingabe sollte eine 2D-Matrix sein, also würden Sie es so nennen c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(Semikolons beginnen eine neue Zeile). Diese Funktion erzwingt nur alle möglichen Bewegungen, sodass wir eine Laufzeit von erhalten O(2^(n^2))
.
Wie es gemacht wird
Dies geschieht durch Auswahl aller möglichen Möglichkeiten, um eine andere Matrix derselben Größe mit Einsen und Null zu füllen. Dies zählt im Grunde genommen in Binärform, wobei jeder Eintrag der Matrix eine bestimmte Potenz von 2 darstellt.
Dann führen wir die Bewegungen an den Zellen durch, die 1 sind. Dies geschieht durch die Summe (mod 2) zweier zweidimensionaler Faltungen mit einem Vektor der Größe 1xn und nx1.
Schließlich entscheiden wir, ob diese Bewegungen tatsächlich das gewünschte Ergebnis liefern, indem wir die Standardabweichung über alle Einträge berechnen. Die Standardabweichung ist nur Null, wenn alle Einträge gleich sind. Und wann immer wir tatsächlich das gewünschte Ergebnis gefunden haben, vergleichen wir es mit der Anzahl der Züge früherer Lösungen. Die Funktion wird zurückgegeben, inf
wenn das angegebene Problem nicht lösbar ist.
Mathematik?
Es ist tatsächlich erwähnenswert, dass all diese Bewegungen zusammen eine abelsche Gruppe bilden! Wenn es jemandem tatsächlich gelingt, diese Gruppen zu verkalken, lassen Sie es mich bitte wissen.
Golfversion:
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
Vollversion (mit der Ausgabe der tatsächlichen Züge.)
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
(als Quadrat neu angeordnet, egal wie).