ID: 
Title:typ2newtest t3 ul
Author:utrMihi
Date:2006-04-12 16:51:302006-04-12 16:37:50
Score:840.2677846.0458
Result:8369184441
CPU Time:64.952159.1991
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 + function moves=solver(bo,nMoves) + [rows, cols] = size(bo); + moves = ones(nMoves,3); + count=0; + if (rows*cols) > 10.5*nMoves + next_move_count = 40; + choke_factor = .957; + de_factor = 2.93; + rot= 1.566; + elseif (rows*cols) > 8.5*nMoves + next_move_count = 29; + choke_factor = .817; + de_factor = 2.93; + rot= 1.566; + elseif rows*cols >= 256 + next_move_count = 26; + choke_factor = .951; + de_factor = 2.8; + rot = 1.4; + else + next_move_count = 26; + choke_factor = 0.945; + de_factor = 2.97; + rot= 1.46; + end + bo = nthroot(bo,rot); + de = ceil(de_factor*nMoves/10); + flip = floor(0.67*nMoves); + while 1 + if count==flip, bo = nthroot(bo,2/(1+rot)); end + [c_l,value_list,mask] = CalculateMoves(rows,cols,bo); + if isempty(c_l), + [swapmv,bo]=CheckForSwap(rows,cols,bo); + if swapmv(1) + count = count+1; + moves(count,:) = swapmv; + if (count==nMoves) + break; + end continue end break 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 count<nMoves-1 + [value_list,pos]=sort(value_list,2,'descend'); + c_l=c_l(pos); + for k=1:min(numel(c_l),next_move_count) + new_bo = ProcessMove(bo,mask,c_l(k)); + new_value_list=fbb3(new_bo); + if (~isempty(new_value_list)) + de_ = max(min(de,nMoves-count-3),1); + if numel(new_value_list)<=de_ + value_list(k) = value_list(k) + sum(new_value_list); + else + value_list(k) = value_list(k) + sum(new_value_list(1:de_)); end - if (I7(k)<I1*I7(1)) - break;end end + if (value_list(k) < choke_factor * value_list(1)) + break; 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) + end + end + [max_val,pos] = max(value_list); + max_cell = c_l(pos); + count = count+1; + moves(count,:) = [mod(max_cell-1,rows)+1,ceil(max_cell/rows),0]; + bo = ProcessMove(bo,mask,max_cell); + + if (count==nMoves) break; 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 + moves = moves(1:count,:); + + function [c_l,value_list,mask] = CalculateMoves(rows,cols,bo) + + mask = zeros(rows,cols); + first_row = find(any(bo,2),1); + + if (first_row == 1) + bk=bo(1); + if bk + mask(1)=1; end - l7(L0)=c*L2;l6(L0)=ii;end + k=1; + for j=2:cols + m = k; + k = k + rows; + bm=bk; + bk=bo(k); + if bk + mask(k) = k; + if (bm == bk) + mask(m) = k; 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 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 + end + end + for i = max(2,first_row):rows + k=i; + bk=bo(k); + if (bk) + mask(k) = k; + m = k-1; + if (bo(m) == bk) + n = -1; + while (n ~= m) + n = m; + m = mask(n); + mask(n) = k; + end + end + end + for j=2:cols + m = k; + k = k + rows; + bm=bk; + bk=bo(k); + if (bk) + mask(k) = k; + if (bm==bk) + mask(m) = k; + end + m = k - 1; + if (bo(m)==bk) + n = -1; + while (n ~= m) + n = m; + m = mask(n); + mask(n) = k; + end + end + end + end + end + c_l = zeros(1,256); + group_count = 0; + group_count_matrix = zeros(rows, cols); + for i=rows:-1:first_row + k = i + rows*(cols-1); + for j=1:cols + if bo(k) + m = mask(k); + if (m == k) + group_count_matrix(k) = 1; 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 + while group_count_matrix(m) == 0 + m = mask(m); end + mask(k) = mask(m); + group_block_count = group_count_matrix(m) + 1; + group_count_matrix(m) = group_block_count; + if (group_block_count == 2) + group_count = group_count + 1; + c_l(1,group_count) = m; + end + mask(m)= k; + end + end + k = k - rows; + end + end + + c_l = c_l(1:group_count); + value_list = zeros(1,group_count); + + for k = 1:group_count + m = c_l(k); + c_l(k) = mask(m); + value_list(k) = group_count_matrix(m) * bo(m); + mask(m) = m; + end + + function B=ProcessMove(B,dj,y) + R=size(B,1);B(y)=0; + col=ceil(y/R); + minCol=col;maxCol=col; + while dj(y)~=y + y=dj(y); + B(y)=0; + col=ceil(y/R); + minCol=min(minCol, col); + maxCol=max(maxCol, col); + end; + for i=minCol:maxCol, + k=B(B(:,i)>0,i); + B(:,i)=0;B(R-numel(k)+1:R,i)=k; + end + + function [swapmv,outbo]=CheckForSwap(rows,cols,bo) + swapper=[-1 rows 1 -rows]; + lentmp=rows*cols; + swapmv=zeros(1,3); + outbo=bo; + maxswap=0; + list=find(bo~=0)'; + nList=numel(list); + for k=1:nList + jj=list(k); + for swapdir=1:4 + np=jj+swapper(swapdir); + if np>0 && np<=lentmp && bo(np)>0 && bo(np)~=bo(jj) + tbo=DoSwap(bo,jj,np); + [s_ceil,s_value]=CalculateMoves(rows,cols,tbo); + if (~isempty(s_value)) + if (max(s_value)> maxswap) + maxswap=max(s_value); + idxq=jj;idxr=swapdir;idxs=np; + end + else + for k2=max(1,k-20):min(nList,k+20) + jj2=list(k2); + for swapdir2=1:4 + np2=jj2+swapper(swapdir2); + if np2>0 && np2<=lentmp && tbo(np2)>0 && tbo(np2)~=tbo(jj2) + tbo2=DoSwap(tbo,jj2,np2); + [s_ceil2,s_value2,s_mask2]=CalculateMoves(rows,cols,tbo2); + if (~isempty(s_value2) && max(s_value2)>maxswap) + [s_max,s_idx]=max(s_value2); + Y=s_ceil2(s_idx); + while (s_mask2(Y)~=Y) + Y = s_mask2(Y); + end if (Y==np || Y==jj) - W6=true; + maxswap=max(s_value2); + idxq=jj;idxr=swapdir;idxs=np; end - if (W6) - Q0=max(W4);Q7=jj;Q8=Q3;Q9=np; end end end end end end end end + if (maxswap>0) + swapmv = [mod(idxq-1,rows)+1,ceil(idxq/rows),idxr]; + outbo=DoSwap(bo,idxq,idxs); end - if (Q0>0) - O0 = [mod(Q7-1,l3),ceil(Q7/l3)-1,Q8];L8=Q4(l2,Q7,Q9); + + function bo = DoSwap(bo,el1,el2) + bo([el1,el2]) = bo([el2,el1]); + + function [clizes]=fbb3(bo) + [s1 s2]=size(bo); + numels=s1*s2; + cl=zeros(numels,1); + co=zeros(numels,1); + is=false(numels,1); + ct=zeros(s1,s2); + cn=1; + ct(s1,1)=1; + cl(1)=bo(s1,1); + for j=2:s2 + cn=cn+1; + if (bo(s1,j-1)==bo(s1,j)) + cn=cn-1; + is(cn)=true; end + ct(s1,j)=cn; + cl(cn)=cl(cn)+bo(s1,j); end - function l2 = Q4(l2,el1,el2) - l2([el1,el2]) = l2([el2,el1]); + ac=cn; + color=0; + for i=s1-1:-1:1 + for j=1:s2 + color=bo(i,j); + if (color) + if (j>1&&bo(i,j-1)==color) + ac=ct(i,j-1); + is(ac)=true; + else + cn=cn+1; + ac=cn; end + if (bo(i+1,j)==color) + if(ac~=ct(i+1,j)) + if (j>1&&bo(i,j-1)==color) + if(ac<ct(i+1,j)) + if(co(ct(i+1,j))&&co(ct(i+1,j))~=ac) + mc=999; + if(ac<mc) + mc=ac; end + if(co(ac)&&co(ac)<mc) + mc=co(ac); end - function y = a37(x, n) + nextco=ac; - y =(x.^(1/n)); + while (nextco) - end+ if nextco<mc + mc=nextco; + end + if(co(nextco)~=nextco) + nextco=co(nextco); + else + nextco=0; + end + end + nextco=co(ct(i+1,j)); + while (nextco) + if nextco<mc + mc=nextco; + end + if(co(nextco)~=nextco) + nextco=co(nextco); + else + nextco=0; + end + end + nextco=ac; + while (nextco) + oldco=nextco; + if(co(nextco)~=nextco) + nextco=co(nextco); + else + nextco=0; + end + co(oldco)=mc; + end + nextco=ct(i+1,j); + while (nextco) + oldco=nextco; + if(co(nextco)~=nextco) + nextco=co(nextco); + else + nextco=0; + end + co(oldco)=mc; + end + co(ac)=mc; + ac=mc; + end + co(ct(i+1,j))=ac; + else + if(co(ac)&&co(ac)~=ct(i+1,j)) + mc=999; + nextco=ac; + de=0; + while (nextco) + de=de+1; + if nextco<mc + mc=nextco; + end + if(co(nextco)~=nextco&&de<15) + nextco=co(nextco); + else + nextco=0; + end + end + nextco=co(ct(i+1,j)); + de=0; + while (nextco) + de=de+1; + if nextco<mc + mc=nextco; + end + if(co(nextco)~=nextco&&de<15) + nextco=co(nextco); + else + nextco=0; + end + end + nextco=ac; + while (nextco) + oldco=nextco; + if(co(nextco)~=nextco) + nextco=co(nextco); + else + nextco=0; + end + co(oldco)=mc; + end + nextco=ct(i+1,j); + while (nextco) + oldco=nextco; + if(co(nextco)~=nextco) + nextco=co(nextco); + else + nextco=0; + end + co(oldco)=mc; + end + co(co(ac))=mc; + co(ac)=mc; + co(ct(i+1,j))=mc; + ac=mc; + end + co(ac)=ct(i+1,j); + ac=ct(i+1,j); + end + is(ac)=true; + else + ac=ct(i+1,j); + is(ac)=true; + end + end + end + cl(ac)=cl(ac)+color; + ct(i,j)=ac; + end + end + end + for i=length(co):-1:2 + if(co(i)&&co(i)~=i) + cl(co(i))=cl(co(i))+cl(i); + cl(i)=0; + end + end + cl=cl(is); + clizes=sort(cl,'descend');