- 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
+ [cell_list,value_list,mask] = CalculateMoves(rows,cols,bo);
+ if isempty(cell_list),
+ [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');
+ cell_list=cell_list(pos);
+ for k=1:min(numel(cell_list),next_move_count)
+ new_bo = ProcessMove(bo,mask,cell_list(k));
+ new_value_list=findbiggestblock3(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 = cell_list(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 [cell_list,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
+
+ cell_list = 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;
+ cell_list(1,group_count) = m;
+ end
+ mask(m)= k;
+ end
+ end
+ k = k - rows;
+ end
+ end
+
+ cell_list = cell_list(1:group_count);
+ value_list = zeros(1,group_count);
+
+ for k = 1:group_count
+ m = cell_list(k);
+ cell_list(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]=findbiggestblock3(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)
+
- y =(x.^(1/n));
+ nextco=ac;
- end+ while (nextco)
+ 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');
|