Matlab 171 ไบต์
อินพุตควรเป็นเมทริกซ์ 2 มิติดังนั้นคุณจะเรียกมันว่า c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(เซมิโคลอนเริ่มต้นแถวใหม่) ฟังก์ชั่นนี้เพียง bruteforces O(2^(n^2))
ย้ายเป็นไปได้ทั้งหมดเพื่อให้เราได้รับรันไทม์ของ
เป็นอย่างไรกันบ้าง
สิ่งนี้ทำได้โดยเลือกวิธีที่เป็นไปได้ทั้งหมดเพื่อเติมเมทริกซ์อื่นที่มีขนาดเท่ากันกับศูนย์และนี่คือการนับโดยทั่วไปในไบนารีซึ่งแต่ละรายการของเมทริกซ์แสดงถึงพลังบางอย่างของ 2
จากนั้นเราทำการเคลื่อนที่บนเซลล์เหล่านั้นคือ 1 ซึ่งกระทำโดยผลรวม (mod 2) ของการบิดสองมิติสองมิติด้วยเวกเตอร์ที่มีขนาด 1xn และ nx1
ในที่สุดเราตัดสินใจว่าการเคลื่อนไหวเหล่านั้นสร้างผลลัพธ์ที่ต้องการจริงหรือไม่โดยการคำนวณค่าเบี่ยงเบนมาตรฐานเหนือทุกรายการ ค่าเบี่ยงเบนมาตรฐานเป็นศูนย์ก็ต่อเมื่อรายการทั้งหมดเหมือนกัน และเมื่อใดก็ตามที่เราพบผลลัพธ์ที่ต้องการจริงเราเปรียบเทียบกับจำนวนการเคลื่อนไหวของการแก้ปัญหาก่อนหน้า ฟังก์ชั่นจะกลับมาinf
หากปัญหาที่ระบุไม่สามารถแก้ไขได้
คณิตศาสตร์?
อันที่จริงแล้วมันเป็นที่น่าสังเกตว่าการเคลื่อนไหวเหล่านั้นทั้งหมดรวมกันสร้างกลุ่มชาวคริสต์! หากใครก็ตามสามารถทำการปลอมแปลงกลุ่มเหล่านั้นได้โปรดแจ้งให้เราทราบ
รุ่น Golfed:
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
(จัดเรียงใหม่เป็นสี่เหลี่ยมไม่สำคัญว่า)