Matlab 171字节
输入应该是2D矩阵,因此您可以这样称呼它 c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(分号开始新的一行)。此功能只是蛮力地进行所有可能的移动,因此我们得到的运行时O(2^(n^2))
。
怎么做
这是通过选择所有可能的方法来填充相同大小的另一个矩阵而用1和0来完成的,这基本上是用二进制计数的,其中矩阵的每个项代表一定的2的幂。
然后,我们对那些为1的像元执行移动,这是通过二维卷积的和(mod 2)以及大小为1xn和nx1的矢量进行的。
最后,我们通过计算所有条目的标准偏差来确定这些移动是否真正产生了预期的结果。如果所有条目都相同,则标准偏差仅为零。并且,每当我们实际找到所需结果时,便将其与先前解决方案的移动次数进行比较。inf
如果给定的问题无法解决,该函数将返回。
数学?
实际上,值得注意的是,所有这些动作共同产生了一个阿贝尔群!如果有人真的设法对这些群体进行分类,请告诉我。
高尔夫球版:
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
(重新排列为正方形,无所谓)。