ID: 
Title:typ2random already 03
Author:utrTom
Date:2006-04-12 16:51:302006-04-05 14:17:55
Score:840.26771569.2421
Result:83691156924
CPU Time:64.95215.9486
Status:PassedPassed
Code:
- function m=solver(tb,nM) - [m,b]=l0(tb,nM,1);st=sum(sum(b));if(st > 800) - [m2,b]=l0(tb,nM,0.9);st2=sum(sum(b));if st2<st - m=m2;end;end - function [l1,l2]=l0(tl2,nl1,z) - l2=zeros(size(tl2,1)+1,size(tl2,2)+2);l2(2:end,2:end-1)=tl2;[l3,l4]=size(l2);l1=ones(nl1,3);l5=0; - zz=zeros(1,floor(((l3-1)*(l4-2))/2));i=1;for r=l3:-1:2 - for cl=l4-2:-1:1 - if mod(r+cl,2) - zz(i)=(cl*l3)+r;i=i+1;end;end;end - l6=zeros(1,900);l7=zeros(1,900);l8=zeros(1,400);l9=zeros(numel(l2),1); - if (l3*l4)>10.5*nl1 - I0=40;I1=.817;I2=2.93;I3=1.566;elseif (l3*l4)>8.5*nl1 - I0=29;I1=.817;I2=2.93;I3=1.566;elseif l3*l4>=256 - I0=26;I1=.951;I2=2.8;I3=1.4;else - I0=26;I1=.945;I2=2.97;I3=1.46;end - I1=I1*z;l2=a37(l2,I3);I4=ceil(I2*nl1/10);I5=floor(0.66*nl1);while 1 - if l5==I5,l2=a37(l2,2/(1+I3));end - [I6,I7,I8] = I9(l2);if isempty(I6),[O0,l2]=O1(l2); - if O0(1) - l5=l5+1;l1(l5,:)=O0;if(l5==nl1) - break;end - continue + function moves = solver(board,nMoves) + %SOLVER Solve the Blockbuster Contest problem + % + % MOVES = SOLVER(BOARD,NMOVES) BlockBuster solver. + % + % MOVES -> [row,column,action] + % action -> 0 busts, 1 swap up, 2 swap right, 3 swap down, 4 swap left + [y x] = size(board); + mymoves = ones(nMoves,3); + mymoves(:,3) = 0; + mymoves(:,2) = x; + mymoves(:,1) = y; + a = y; + b = x; + i = 1; + done = 0; + avg = mean(mean(board)); + while (done ~= 1) + common = sum(sum(board == board(a,b))) / x * y; + % if (connected(board,a,b) > 2) && (i <= nMoves) && (board(a,b) > 0) %&& rand > 0.05 + % mymoves(i,1)=a; + % mymoves(i,2)=b; + % mymoves(i,3)=0; + % board = zeroize(board,a,b); + % board = gravity(board); + % i = i+1; + % elseif (connected(board,a,b) > 1) && (i <= nMoves) && (board(a,b) > 0) %&& rand > 0.1 + % mymoves(i,1)=a; + % mymoves(i,2)=b; + % mymoves(i,3)=0; + % board = zeroize(board,a,b); + % board = gravity(board); + % i = i+1; + % elseif (connected(board,a,b) > 1) && (i <= nMoves) && (board(a,b) > 0) && board(a,b) > avg && rand < common + % mymoves(i,1)=a; + % mymoves(i,2)=b; + % mymoves(i,3)=0; + % board = zeroize(board,a,b); + % board = gravity(board); + % i = i+1; + % elseif (connected(board,a,b) > 0) && (i <= nMoves) && (board(a,b) > 0) && rand > 0.8 + % mymoves(i,1)=a; + % mymoves(i,2)=b; + % mymoves(i,3)=0; + % board = zeroize(board,a,b); + % board = gravity(board); + % i = i+1; + % end + if (board(a,b) > 0) + mark = footprint(board,a,b); + else + mark = 0; + end + while (board(a,b) > 0) && (mark > 1) && (i <= nMoves) && rand > .85/mark + mymoves(i,1)=a; + mymoves(i,2)=b; + mymoves(i,3)=0; + board = zeroize(board,a,b); + board = gravity(board); + i = i+1; + if (board(a,b) > 0) + mark = footprint(board,a,b); + else + mark = 0; + end + end + % while (board(a,b) > 0) && (footprint(board,a,b) > 2) && (i <= nMoves) && rand < 0.5 + % mymoves(i,1)=a; + % mymoves(i,2)=b; + % mymoves(i,3)=0; + % board = zeroize(board,a,b); + % board = gravity(board); + % i = i+1; + % end + if b > 1 + b = b - 1; + else + b = x; + if a > 1 + a = a-1; + else + if i > nMoves + done = 1; + else + a = y; + b = x; + end + end + end + if rand < 0.01 + a = floor(rand * y) +1; + b = floor(rand * x) +1; + elseif rand < 0.001 + a = y; + b = x; + end + if i > nMoves + done = 1; + end end - break + moves = mymoves; + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + function value = connected(board,a,b) + [y x] = size(board); + answer = 0; + if (a>1) + if (board(a,b) == board(a-1,b)) + answer = answer +1; + end end - if l5<nl1-1 - [I7,O2]=sort(I7,2,'descend');I6=I6(O2);for k=1:min(numel(I6),I0) - O3=O4(l2,I8,I6(k));[O5,O6]=I9(O3);if (~isempty(O5)) - I4_=max(min(I4,nl1-l5-3),1);if numel(O6)<=I4_ - I7(k)=I7(k)+sum(O6);else - O6=sort(O6,2,'descend');I7(k)=I7(k)+sum(O6(1:I4_));end + if (a<y) + if (board(a,b) == board(a+1,b)) + answer = answer +1; + end end - if (I7(k)<I1*I7(1)) - break;end + if (b>1) + if (board(a,b) == board(a,b-1)) + answer = answer +1; + end end + if (b<x) + if (board(a,b) == board(a,b+1)) + answer = answer +1; + end end - [O7,O2]=max(I7);O8=I6(O2);l5=l5+1;l1(l5,:)=[mod(O8-1,l3),ceil(O8/l3)-1,0];l2=O4(l2,I8,O8); - if (l5==nl1) - break; + value = answer; + return + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + function value = gravity(board) + [y x] = size(board); + + for i = 1:x + for j = y:-1:2 + while(board(j,i)==0) && (sum(board(1:j-1,i)) > 0) + for k = j:-1:2 + board(k,i) = board(k-1,i); + end + board(1,i) = 0; + end + end end + + value = board; + return + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + function value = zeroize(board,a,b) + target = board(a,b); + board(a,b) = 0; + board = zeroize_more(board,a,b,target); + value = board; + return + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + function value = zeroize_more(board,a,b,target) + [y x] = size(board); + if (a>1) + if board(a-1,b) == target + board(a-1,b) = 0; + board = zeroize_more(board,a-1,b,target); + end end - l1=l1(1:l5,:); - function [O5,O6,O9]=I9(l2); - [l3,l4]=size(l2);L0=0;ii=0;L1=0;L2=0;L3=0;c=0; - for zi=1:numel(zz) - i=zz(zi);c=l2(i);if c && (l2(i+1)==c||l2(i+l3)==c||l2(i-1)==c||l2(i-l3)==c) - L0=L0+1;l8(1)=i;l2(i)=0;L1=i;L2=0;L3=1;while (L3-L2) - L2=L2+1;ii=l8(L2);l9(ii)=L1;L1=ii;if l2(ii+1)==c - L3=L3+1;l8(L3)=ii+1;l2(ii+1)=0;end - if l2(ii-1)==c - L3=L3+1;l8(L3)=ii-1;l2(ii-1)=0;end - if l2(ii+l3)==c - L3=L3+1;l8(L3)=ii+l3;l2(ii+l3)=0;end - if l2(ii-l3)==c - L3=L3+1;l8(L3)=ii-l3;l2(ii-l3)=0;end + if (a<y) + if board(a+1,b) == target + board(a+1,b) = 0; + board = zeroize_more(board,a+1,b,target); + end end - l7(L0)=c*L2;l6(L0)=ii;end + if (b>1) + if board(a,b-1) == target + board(a,b-1) = 0; + board = zeroize_more(board,a,b-1,target); + end end - O5=l6(1:L0);O6=l7(1:L0);O9=l9;end - function B=O4(B,dj,y) - B(y)=0;L4=ceil(y/l3);L5=L4;L6=L4;while dj(y)~=y - y=dj(y);B(y)=0;L4=ceil(y/l3);L5=min(L5, L4);L6=max(L6, L4);end; - for ip=L5:L6, - kp=B(B(:,ip)>0,ip);B(:,ip)=0;B(l3-numel(kp)+1:l3,ip)=kp;end + if (b<x) + if board(a,b+1) == target + board(a,b+1) = 0; + board = zeroize_more(board,a,b+1,target); + end end - function [O0,L8]=O1(l2) - [l3 l4]=size(l2);L7=[-1 l3 1 -l3];L9=l3*l4;O0=zeros(1,3);L8=l2;Q0=0;Q1=find(l2~=0)';Q2=numel(Q1); - for kc=1:Q2 - jj=Q1(kc);for Q3=1:4 - np=jj+L7(Q3);if np>0 && np<=L9 && l2(np)>0 && l2(np)~=l2(jj) - tl2=Q4(l2,jj,np);[Q5,Q6]=I9(tl2);if (~isempty(Q6)) - if (max(Q6)> Q0) - Q0=max(Q6);Q7=jj;Q8=Q3;Q9=np;end - else - for k2=max(1,kc-20):min(Q2,kc+20) - W0=Q1(k2);for W1=1:4 - np2=W0+L7(W1);if np2>0 && np2<=L9 && tl2(np2)>0 && tl2(np2)~=tl2(W0) - W2=Q4(tl2,W0,np2);[W3,W4,W5]=I9(W2);if (~isempty(W4) && max(W4)>Q0) - W6=false;[W7,W8]=max(W4);Y=W3(W8); - while (W5(Y)~=Y) - Y = W5(Y);if (Y==np || Y==jj) - W6=true;end + value = board; + return + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + function value = footprint(board,a,b) + target = board(a,b); + [y x] = size(board); + footprint_map = zeros(y,x); + footprint_map(a,b) = 1; + footprint_map = footprint_more(board,a,b,target,footprint_map); + value = sum(sum(footprint_map)); + return + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + function value = footprint_more(board,a,b,target,footprint_map) + [y x] = size(board); + if (a>1) + if board(a-1,b) == target && footprint_map(a-1,b)==0 + footprint_map(a-1,b) = 1; + footprint_map = footprint_more(board,a-1,b,target,footprint_map); + end end - if (Y==np || Y==jj) - W6=true; + if (a<y) + if board(a+1,b) == target && footprint_map(a+1,b)==0 + footprint_map(a+1,b) = 1; + footprint_map = footprint_more(board,a+1,b,target,footprint_map); + end end - if (W6) - Q0=max(W4);Q7=jj;Q8=Q3;Q9=np; + if (b>1) + if board(a,b-1) == target && footprint_map(a,b-1)==0 + footprint_map(a,b-1) = 1; + footprint_map = footprint_more(board,a,b-1,target,footprint_map); + end end + if (b<x) + if board(a,b+1) == target && footprint_map(a,b+1)==0 + footprint_map(a,b+1) = 1; + footprint_map = footprint_more(board,a,b+1,target,footprint_map); + end end - end + value = footprint_map; - end + return - end + - end - end - end - end - if (Q0>0) - O0 = [mod(Q7-1,l3),ceil(Q7/l3)-1,Q8];L8=Q4(l2,Q7,Q9); - end - end - function l2 = Q4(l2,el1,el2) - l2([el1,el2]) = l2([el2,el1]); - end - end - end - function y = a37(x, n) - y =(x.^(1/n)); - end