ID: 
Title:tweaky bird and pushy cat 21Marco Tullio 187
Author:srachFabio Carnevale
Date:2008-05-07 11:55:182008-05-07 11:58:59
Score:13374.019713432.8536
Result:133071.00 (cyc: 21, node: 7229)133994.00 (cyc: 16, node: 6625)
CPU Time:47.885135.1477
Status:PassedPassed
Code:
function W = solv(B) - tweak = rand(43,1); - W=solverF(B); - S = mygrade(B,W); - - [nr,nc] = size(B); - [W2,S2] = sunday(B,[1 2],[1 2],4*nr*nc); - if S > S2 - W = W2; - S=S2; + YJmd=261; + od8K = rand(43,1); + W=Vlcd(B); + IAFL = r2Sj(B,W); + [hebd,uqU4] = size(B); + uR3t = B(hebd:-1:1,:); + uR3t = uR3t.'; + [P2Vi,wGy7] = qXH0(uR3t,[1 2],[1 2],4*hebd*uqU4); + if IAFL > wGy7 + W = [hebd-P2Vi(:,2)+1 P2Vi(:,1) hebd-P2Vi(:,4)+1 P2Vi(:,3)]; + IAFL=wGy7; end - - - X = B(nr:-1:1,:); - X = X.'; - - [W2,S2] = sunday(X,[1 2],[1 2],4*nr*nc); - if S > S2 - W = [nr-W2(:,2)+1 W2(:,1) nr-W2(:,4)+1 W2(:,3)]; - S=S2; + AJ_o=rand('state'); + rand(YJmd,1); + if IAFL>1000 && rand<.5 + [P2Vi,wGy7] = qXH0(uR3t,[1 2],[1 2],4*hebd*uqU4); + if IAFL > wGy7 + W = [hebd-P2Vi(:,2)+1 P2Vi(:,1) hebd-P2Vi(:,4)+1 P2Vi(:,3)]; + IAFL=wGy7; end - end - - - function [W,S] = sunday(B0,x000,y000,th000) - [nR,nC]=size(B0); - Borig= -ones(nR+2,nC+2); - Borig(2:end-1,2:end-1)=B0; - Bedit = Borig; - - maxbridges = 4; - - if size(Bedit,2) > 18 - cutfirst = 4; - cutsecond = 8; - cutoff = 18; + if IAFL>1000 && rand<.5 + [P2Vi,wGy7] = qXH0(uR3t,[1 2],[1 2],4*hebd*uqU4); + if IAFL > wGy7 + W = [hebd-P2Vi(:,2)+1 P2Vi(:,1) hebd-P2Vi(:,4)+1 P2Vi(:,3)]; + IAFL=wGy7; + end + end + rand('state',AJ_o); + end + function [W,IAFL] = qXH0(t5aT,t4HT,afnA,I19Z) + [h_yD,DXG1]=size(t5aT); + h0cv= -ones(h_yD+2,DXG1+2); + h0cv(2:end-1,2:end-1)=t5aT; + dFwL = h0cv; + CHo9 = 4; + if size(dFwL,2) > 20 + Lvih = 4; + GhOJ = 8; + p8Xc = 18; else - cutfirst = 3; - cutsecond = 7; - cutoff = 13; + Lvih = 3; + GhOJ = 7; + p8Xc = 13; end - - S = inf; - X1 = [1 2;2 1]; - X2 = [1 3;3 1]; - Y = [3 2 1;1 2 3]; - - % fprintf('\n'); - - for x = x000 - if x == 2 - [U BU] = phase1(Bedit,cutfirst,X1(x,:)); - [UU BUU] = phase3(BU,U,cutsecond,X2(x,:)); - [V BX] = phase3(BUU,UU,cutoff,X2(x,:)); - else - [U BU] = phase1(Bedit,4,X1(x,:)); - [V BX] = phase3(BU,U,11,X2(x,:)); - end - - for y = y000 - % if x == 1 && y == 2, continue, end - %if x == 2 && y == 2 && S > th000, return, end - W1 = phase2_a(Bedit,BX,V,maxbridges,cutoff,Y(y,:))-1; - S1 = mygrade(B0,W1); - % fprintf('x=%d, y=%d, %d', x, y, S1); - % if isfinite(S), fprintf(' (%4d)\n', S1 - S), else, - % fprintf('\n'), end - if S1 <= S - S = S1; - W = W1; - maxbridges = maxbridges - 1; - end - end + IAFL = inf; + U_IB = [1 2;2 1]; + bq_l = [1 3;3 1]; + qyL0 = [3 2 1;1 2 3]; + for SNU7 = t4HT + if SNU7 == 2 + [RRqd kOmM] = aHtS(dFwL,Lvih,U_IB(SNU7,:)); + [YZ9f kCRf] = QMB3(kOmM,RRqd,GhOJ,bq_l(SNU7,:)); + [dnSz MmBp] = QMB3(kCRf,YZ9f,p8Xc,bq_l(SNU7,:)); + else + [RRqd kOmM] = aHtS(dFwL,4,U_IB(SNU7,:)); + [dnSz MmBp] = QMB3(kOmM,RRqd,11,bq_l(SNU7,:)); end + for TMwV = afnA + UG5r = uXwe(dFwL,MmBp,dnSz,CHo9,p8Xc,qyL0(TMwV,:))-1; + K9OR = r2Sj(t5aT,UG5r); + if K9OR <= IAFL + IAFL = K9OR; + W = UG5r; + CHo9 = CHo9 - 1; end - - %% - function score = mygrade(B,W) - nR=size(B,1); - B(W(:,1)+(W(:,2)-1)*nR)=0; - B(W(:,3)+(W(:,4)-1)*nR)=0; - score=sum(B(:))+size(W,1)+sum(W(:,1)==W(:,3)&W(:,2)==W(:,4))*24; end - - %% - function [pincount k] = analyzeboard(B,rz) - - % make a sorted list of all pins - pin = sort(B(B>0),'descend'); - npins = size(pin,1); - if npins < 1 - pincount = []; - k = 0; - return end - - uniPins=pin(diff([0;pin])~=0); - % pin, count, benefit - - pincount = zeros(nnz(uniPins),3); - thesepins=histc(pin,uniPins(end:-1:1)); - pincount(:,1)=uniPins; - pincount(:,2)=thesepins(end:-1:1); - k=nnz(uniPins); - - if rz < 3, return, end - % calculate the benefit of a path - for i = 1:k - if pincount(i,2) >= 2 - p = pincount(i,1); - [row col] = find(B == p); - d = 0; - N = size(row,1); - d=sum(abs(diff(row))+abs(diff(col))); - pincount(i,3) = pincount(i,2)*p - 0.85 * d; - end end + function jQ_m = r2Sj(B,W) + h_yD=size(B,1); + B(W(:,1)+(W(:,2)-1)*h_yD)=0; + B(W(:,3)+(W(:,4)-1)*h_yD)=0; + jQ_m=sum(B(:))+size(W,1)+sum(W(:,1)==W(:,3)&W(:,2)==W(:,4))*24; end - - %% - function [W B] = phase1(B,cutoff,rz) - % fprintf('-- phase 1 --\n'); - + function [NRBI f2kZ] = PDwY(B,m1qh) + Lg9n = sort(B(B>0),'descend'); + B_bx = size(Lg9n,1); + if B_bx < 1 + NRBI = []; + f2kZ = 0; + return + end + mdV1=Lg9n(diff([0;Lg9n])~=0); + NRBI = zeros(nnz(mdV1),3); + RrVt=histc(Lg9n,mdV1(end:-1:1)); + NRBI(:,1)=mdV1; + NRBI(:,2)=RrVt(end:-1:1); + f2kZ=nnz(mdV1); + if m1qh < 3, return, end + for Naeu = 1:f2kZ + if NRBI(Naeu,2) >= 2 + ET7Q = NRBI(Naeu,1); + [tdpI obXn] = find(B == ET7Q); + LgOf = 0; + yLXP = size(tdpI,1); + LgOf=sum(abs(diff(tdpI))+abs(diff(obXn))); + NRBI(Naeu,3) = NRBI(Naeu,2)*ET7Q - 0.85 * LgOf; + end + end + end + function [W B] = aHtS(B,p8Xc,m1qh) W = []; - - [pincount k] = analyzeboard(B,rz); - - if k < 1 - return + [NRBI f2kZ] = PDwY(B,m1qh); + if f2kZ < 1 + return end - - pincount=sortrows(pincount,-rz); - - for i = 1:k - if pincount(i,2) >= 2 - p = pincount(i,1); - [row col] = find(B == p); - N = size(row,1); - % find all pairwise distances - Npairs = N*(N-1)/2; - dist = zeros(Npairs,3); - [I J]=find(tril(ones(N),-1)); - dist(:,1)=J; - dist(:,2)=I; - dist(:,3)=abs(col(I)-col(J))+abs(row(I)-row(J)); - % sort by distance - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - - % try to connect the closest pair possible - npins = 0; - for x = 1:Npairs - if dist(x,3) > cutoff+1 - % fprintf('warning: dist = %2d\n', dist(x,3)); - break - end - a = dist(x,1); - b = dist(x,2); - % path = simplepath([row(a); row(b)], [col(a); col(b)], -p); - path = complexpath(B,[row(a); row(b)], [col(a); col(b)], -p, cutoff, 2*p); - if size(path,1) > 0 - % fprintf('p = %d, connect a=%d, b=%d, dist = %d\n', p, a, b, dist(x,3)); - % fprintf('\nFound path, p = %d, r=%d c=%d, r=%d, c=%d\n', p, row(a), col(a), row(b), col(b)); - W = [W; path]; - - B = addwirepath(B,path,-p); - - % pinlist = [row(a) col(a); row(b) col(b)]; - npins = 2; - edit = [1:(a-1) (a+1):(b-1) (b+1):N]; - row = [row(a); row(b); row(edit)]; - col = [col(a); col(b); col(edit)]; - break - else - % fprintf('p = %d, cannot connect a=%d, b=%d, dist = %d\n', p, a, b, dist(x,3)); - end - end - - if npins < 2 - continue - end - - for j = 3:N - % find all pins and wires - [row2 col2] = find(B == -p); - Npinwires = size(row2,1); - % fprintf('npins = %d, nwires = %d\n', npins, Npinwires - npins); - - % find all pairwise distances - % a = already connected (pin or wire), b = not yet connected - Npairs = Npinwires * (N - npins); - - - dist = zeros(Npairs,3); - x = 0; - for a = 1:Npinwires - for b = (npins+1):N - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row2(a)-row(b)) + abs(col2(a)-col(b)); - end - end - % sort by distance - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - - % try to connect closest pair possible - connected = false; - for x = 1:Npairs - if dist(x,3) > cutoff+1 - % fprintf('warning: dist = %2d\n', dist(x,3)); - break - end - a = dist(x,1); - b = dist(x,2); - % path = simplepath([row2(a); row(b)], [col2(a); col(b)], -p); - path = complexpath(B,[row2(a); row(b)], [col2(a); col(b)], -p, cutoff, p); - if size(path,1) > 0 - W = [W; path]; - - B = addwirepath(B,path,-p); - - npins = npins + 1; - connected = true; - row([j b]) = row([b j]); - col([j b]) = col([b j]); - break - end - end - - if ~connected - break - end - end - - end + NRBI=sortrows(NRBI,-m1qh); + for Naeu = 1:f2kZ + if NRBI(Naeu,2) >= 2 + ET7Q = NRBI(Naeu,1); + [tdpI obXn] = find(B == ET7Q); + yLXP = size(tdpI,1); + eS_w = yLXP*(yLXP-1)/2; + dist = zeros(eS_w,3); + [WHt7 ILQM]=find(tril(ones(yLXP),-1)); + dist(:,1)=ILQM; + dist(:,2)=WHt7; + dist(:,3)=abs(obXn(WHt7)-obXn(ILQM))+abs(tdpI(WHt7)-tdpI(ILQM)); + [LgOf RQMk] = sort(dist(:,3)); + dist = dist(RQMk,:); + B_bx = 0; + for SNU7 = 1:eS_w + if dist(SNU7,3) > p8Xc+1 + break end + B3cr = dist(SNU7,1); + Zi5w = dist(SNU7,2); + path = xMxg(B,[tdpI(B3cr); tdpI(Zi5w)], [obXn(B3cr); obXn(Zi5w)], -ET7Q, p8Xc, 2*ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + B_bx = 2; + edit = [1:(B3cr-1) (B3cr+1):(Zi5w-1) (Zi5w+1):yLXP]; + tdpI = [tdpI(B3cr); tdpI(Zi5w); tdpI(edit)]; + obXn = [obXn(B3cr); obXn(Zi5w); obXn(edit)]; + break + else end - - %% - function [W B] = phase2(Borig,B,W,maxbridges,kappa,rz) - - function addbridgewirepath() - for w = 1:size(path,1); - if path(w,1) == path(w,3) % horizontal - BH(path(w,1),path(w,2)) = false; - BH(path(w,3),path(w,4)) = false; - if path(w,2) == path(w,4) - B(path(w,1),path(w,2)) = -9999; - end - end - if path(w,2) == path(w,4) % vertical - BV(path(w,1),path(w,2)) = false; - BV(path(w,3),path(w,4)) = false; - end end + if B_bx < 2 + continue end - - % fprintf('-- phase 2 --\n'); - - [BH BV] = buildbridges(Borig,B,W); - - [pincount k] = analyzeboard(B,rz); - if k < 1, return, end - - pincount=sortrows(pincount,-rz); - - for i = 1:k - p = pincount(i,1); - - Npinwires = sum(B == -p); - - if Npinwires == 0 - % fprintf('p = %d, no previous pinwires\n', p); - - if pincount(i,2) >= 2 - [row col] = find(B == p); - N = size(row,1); - % find all pairwise distances - Npairs = N*(N-1)*.5; - dist = zeros(Npairs,3); - x = 0; - for a = 1:N - for b = (a+1):N - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row(a)-row(b)) + abs(col(a)-col(b)); - end - end - % sort by distance - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - - maxstep = min((maxbridges*25)+kappa,2*p+1); - - % try to connect the closest pair possible - connected = false; - for x = 1:Npairs - if dist(x,3) > maxstep+1 - % fprintf('warning: dist = %2d\n', dist(x,3)); - break - end - a = dist(x,1); - b = dist(x,2); - path = bridgepath(B,BH,BV,[row(a); row(b)], [col(a); col(b)], -p, maxbridges, kappa, ceil(1.85*p)); - if size(path,1) > 0 - % fprintf('\nBRIDGE path, p = %d, r=%d c=%d, r=%d, c=%d\n', p, row(a), col(a), row(b), col(b)); - W = [W; path]; - - B = addwirepath(B,path,-p); - addbridgewirepath(); - - connected = true; - break - end - end - if ~connected - continue - end - end - end - - [row col] = find(B == p); - Npins = size(row,1); - - maxstep = min((maxbridges*25)+kappa,p+1); - - for j = 1:Npins - [row2 col2] = find(B == -p); - Npinwires = size(row2,1); - - % find all pairwise distances - % a = already connected (pin or wire), b = not yet connected - Npairs = Npinwires * (Npins-j+1); - dist = zeros(Npairs,3); - x = 0; - for a = 1:Npinwires - for b = j:Npins - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row2(a)-row(b)) + abs(col2(a)-col(b)); - end - end - % sort by distance - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - - % try to connect closest pair possible - connected = false; - for x = 1:Npairs - if dist(x,3) > maxstep+1 - % fprintf('warning: dist = %2d\n', dist(x,3)); - break - end - a = dist(x,1); - b = dist(x,2); - path = bridgepath(B,BH,BV,[row2(a); row(b)], [col2(a); col(b)], -p, maxbridges, kappa, p); - if size(path,1) > 0 - % fprintf('\nEXTRA BRIDGE path, p = %d, r=%d c=%d, r=%d, c=%d\n', p, row2(a), col2(a), row(b), col(b)); - W = [W; path]; - - B = addwirepath(B,path,-p); - addbridgewirepath(); - - connected = true; - - row([j b]) = row([b j]); - col([j b]) = col([b j]); - break - end - end - - if ~connected - break - end - end - + for f_kg = 3:yLXP + [Z_Xc w8iv] = find(B == -ET7Q); + aRIF = size(Z_Xc,1); + eS_w = aRIF * (yLXP - B_bx); + USJW = (1:aRIF*yLXP)'; + Zi5w=mod(USJW-1,yLXP)+1; + B3cr=ceil(USJW/yLXP); + Epos = (Zi5w>B_bx); + B3cr = B3cr(Epos); + Zi5w = Zi5w(Epos); + LgOf = abs(Z_Xc(B3cr)-tdpI(Zi5w)) + abs(w8iv(B3cr)-obXn(Zi5w)); + dist = [B3cr,Zi5w,LgOf]; + [LgOf RQMk] = sort(dist(:,3)); + dist = dist(RQMk,:); + qX1I = false(yLXP,1); + I1cJ = false; + for SNU7 = 1:eS_w + if dist(SNU7,3) > p8Xc+1 + break end - + Zi5w = dist(SNU7,2); + if qX1I(Zi5w) + randperm(4); + continue end - - %% - function [W B] = phase3(B,W,kappa,rz) - - - % fprintf('-- phase 3 --\n'); - - [pincount k] = analyzeboard(B,rz); - if k < 1, return, end - - pincount=sortrows(pincount,-rz); - - for i = 1:k - p = pincount(i,1); - - Npinwires = sum(B == -p); - - if Npinwires == 0 - % fprintf('p = %d, no previous pinwires\n', p); - - if pincount(i,2) >= 2 - [row col] = find(B == p); - N = size(row,1); - % find all pairwise distances - Npairs = N*(N-1)*.5; - dist = zeros(Npairs,3); - x = 0; - for a = 1:N - for b = (a+1):N - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row(a)-row(b)) + abs(col(a)-col(b)); - end - end - % sort by distance - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - - maxstep = min(kappa,2*p+1); - - % try to connect the closest pair possible - connected = false; - for x = 1:Npairs - if dist(x,3) > maxstep+1 - % fprintf('warning: dist = %2d\n', dist(x,3)); - break - end - a = dist(x,1); - b = dist(x,2); - % path = bridgepath(B,BH,BV,[row(a); row(b)], [col(a); col(b)], -p, maxbridges, kappa, 2*p); - path = complexpath(B,[row(a); row(b)], [col(a); col(b)], -p, kappa, 2*p); - if size(path,1) > 0 - % fprintf('\nBRIDGE path, p = %d, r=%d c=%d, r=%d, c=%d\n', p, row(a), col(a), row(b), col(b)); - W = [W; path]; - - B = addwirepath(B,path,-p); - % [B BH BV] = addbridgewirepath(B,BH,BV,path,-p); - - connected = true; - break - end - end - if ~connected - continue - end - end - end - - [row col] = find(B == p); - Npins = size(row,1); - - maxstep = min(kappa,p+1); - - for j = 1:Npins - [row2 col2] = find(B == -p); - Npinwires = size(row2,1); - - % find all pairwise distances - % a = already connected (pin or wire), b = not yet connected - Npairs = Npinwires * (Npins-j+1); - dist = zeros(Npairs,3); - x = 0; - for a = 1:Npinwires - for b = j:Npins - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row2(a)-row(b)) + abs(col2(a)-col(b)); - end - end - % sort by distance - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - - % try to connect closest pair possible - connected = false; - for x = 1:Npairs - if dist(x,3) > maxstep+1 - % fprintf('warning: dist = %2d\n', dist(x,3)); - break - end - a = dist(x,1); - b = dist(x,2); - % path = bridgepath(B,BH,BV,[row2(a); row(b)], [col2(a); col(b)], -p, maxbridges, kappa, p); - path = complexpath(B,[row2(a); row(b)], [col2(a); col(b)], -p, kappa, 2*p); - if size(path,1) > 0 - % fprintf('\nEXTRA BRIDGE path, p = %d, r=%d c=%d, r=%d, c=%d\n', p, row2(a), col2(a), row(b), col(b)); - W = [W; path]; - - B = addwirepath(B,path,-p); - % [B BH BV] = addbridgewirepath(B,BH,BV,path,-p); - - connected = true; - row([j b]) = row([b j]); - col([j b]) = col([b j]); - break - end - end - - if ~connected - break - end - end - + B3cr = dist(SNU7,1); + path = xMxg(B,[Z_Xc(B3cr); tdpI(Zi5w)], [w8iv(B3cr); obXn(Zi5w)], -ET7Q, p8Xc, ET7Q); + qX1I(Zi5w)=true; + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + B_bx = B_bx + 1; + I1cJ = true; + tdpI([f_kg Zi5w]) = tdpI([Zi5w f_kg]); + obXn([f_kg Zi5w]) = obXn([Zi5w f_kg]); + break end - end - - %% - function [BH BV] = buildbridges(Borig,B,path) - [NR NC] = size(B); - BH = Borig == 0; - BV = BH; - BH(:,[1 NC]) = false; - BV([1 NR],:) = false; - for i = 1:size(path,1) - if path(i,1) == path(i,3) % horizontal - BH(path(i,1),path(i,2)) = false; - BH(path(i,3),path(i,4)) = false; - end - if path(i,2) == path(i,4) % vertical - BV(path(i,1),path(i,2)) = false; - BV(path(i,3),path(i,4)) = false; - end + if ~I1cJ + break end end - - %% - function B = addwirepath(B,path,label) - B(path(1,1),path(1,2)) = label; - for i = 1:size(path,1); - B(path(i,3),path(i,4)) = label; end end - - %% - function path = traceback(z,PZ,NR,t) - path = zeros(t,4); - dr = mod(z,NR); - dc = ceil(z/NR); - for j = 1:t - path(j,1:2) = [dr dc]; - z = PZ(z); - dr = mod(z,NR); - dc = ceil(z/NR); - path(j,3:4) = [dr dc]; end + function [W B] = QMB3(B,W,cp3C,m1qh) + [NRBI f2kZ] = PDwY(B,m1qh); + if f2kZ < 1, return, end + NRBI=sortrows(NRBI,-m1qh); + for Naeu = 1:f2kZ + ET7Q = NRBI(Naeu,1); + aRIF = sum(B == -ET7Q); + if aRIF == 0 + if NRBI(Naeu,2) >= 2 + [tdpI obXn] = find(B == ET7Q); + yLXP = size(tdpI,1); + eS_w = yLXP*(yLXP-1)*.5; + USJW = (1:yLXP*yLXP)'; + Zi5w=mod(USJW-1,yLXP)+1; + B3cr=ceil(USJW/yLXP); + Epos = (B3cr<Zi5w); + B3cr = B3cr(Epos); + Zi5w = Zi5w(Epos); + LgOf = abs(tdpI(B3cr)-tdpI(Zi5w)) + abs(obXn(B3cr)-obXn(Zi5w)); + dist = [B3cr,Zi5w,LgOf]; + [LgOf RQMk] = sort(dist(:,3)); + dist = dist(RQMk,:); + maxstep = min(cp3C,2*ET7Q+1); + I1cJ = false; + for SNU7 = 1:eS_w + if dist(SNU7,3) > maxstep+1 + break end - - - function path = complexpath(B,row,col,label,cutoff,maxpathlen) - - % - complexpath - - [NR NC] = size(B); - PZ = zeros(NR,NC); - C = -ones(NR,NC); - C(row(2),col(2)) = 0; % source - - % tag the targets - C(row(1),col(1)) = -2; - C( B == label ) = -2; - - znext = zeros(NR*NC,1); - znext(1) = row(2) + (col(2)-1)*NR; + B3cr = dist(SNU7,1); + Zi5w = dist(SNU7,2); + path = xMxg(B,[tdpI(B3cr); tdpI(Zi5w)], [obXn(B3cr); obXn(Zi5w)], -ET7Q, cp3C, 2*ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + I1cJ = true; + break + end + end + if ~I1cJ + continue + end + end + end + [tdpI obXn] = find(B == ET7Q); + X8vM = size(tdpI,1); + maxstep = min(cp3C,ET7Q+1); + for f_kg = 1:X8vM + [Z_Xc w8iv] = find(B == -ET7Q); + aRIF = size(Z_Xc,1); + eS_w = aRIF * (X8vM-f_kg+1); + USJW = (1:aRIF*X8vM)'; + Zi5w=mod(USJW-1,X8vM)+1; + B3cr=ceil(USJW/X8vM); + Epos = (Zi5w>=f_kg); + B3cr = B3cr(Epos); + Zi5w = Zi5w(Epos); + LgOf = abs(Z_Xc(B3cr)-tdpI(Zi5w)) + abs(w8iv(B3cr)-obXn(Zi5w)); + dist = [B3cr,Zi5w,LgOf]; + [LgOf RQMk] = sort(dist(:,3)); + dist = dist(RQMk,:); + qX1I = false(X8vM,1); + I1cJ = false; + for SNU7 = 1:eS_w + if dist(SNU7,3) > maxstep+1 + break + end + Zi5w = dist(SNU7,2); + if qX1I(Zi5w) + randperm(4); + continue + end + B3cr = dist(SNU7,1); + path = xMxg(B,[Z_Xc(B3cr); tdpI(Zi5w)], [w8iv(B3cr); obXn(Zi5w)], -ET7Q, cp3C, 2*ET7Q); + qX1I(Zi5w)=true; + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + I1cJ = true; + tdpI([f_kg Zi5w]) = tdpI([Zi5w f_kg]); + obXn([f_kg Zi5w]) = obXn([Zi5w f_kg]); + break + end + end + if ~I1cJ + break + end + end + end + end + function [UGqt lirh] = ce2R(h0cv,B,path) + [Fd3b LeaN] = size(B); + UGqt = h0cv == 0; + lirh = UGqt; + UGqt(:,[1 LeaN]) = false; + lirh([1 Fd3b],:) = false; + for Naeu = 1:size(path,1) + if path(Naeu,1) == path(Naeu,3) + UGqt(path(Naeu,1),path(Naeu,2)) = false; + UGqt(path(Naeu,3),path(Naeu,4)) = false; + end + if path(Naeu,2) == path(Naeu,4) + lirh(path(Naeu,1),path(Naeu,2)) = false; + lirh(path(Naeu,3),path(Naeu,4)) = false; + end + end + end + function B = Qr5n(B,path,pmPS) + B(path(1,1),path(1,2)) = pmPS; + for Naeu = 1:size(path,1); + B(path(Naeu,3),path(Naeu,4)) = pmPS; + end + end + function path = YwNf(uVKw,yJJG,Fd3b,mp3Z) + path = zeros(mp3Z,4); + eoU8 = mod(uVKw,Fd3b); + MILc = ceil(uVKw/Fd3b); + for f_kg = 1:mp3Z + path(f_kg,1:2) = [eoU8 MILc]; + uVKw = yJJG(uVKw); + eoU8 = mod(uVKw,Fd3b); + MILc = ceil(uVKw/Fd3b); + path(f_kg,3:4) = [eoU8 MILc]; + end + end + function path = xMxg(B,tdpI,obXn,pmPS,p8Xc,THgh) + [Fd3b LeaN] = size(B); + yJJG = zeros(Fd3b,LeaN); + z6WH = -ones(Fd3b,LeaN); + z6WH(tdpI(2),obXn(2)) = 0; + z6WH(tdpI(1),obXn(1)) = -2; + z6WH( B == pmPS ) = -2; + l2Hd = zeros(Fd3b*LeaN,1); + l2Hd(1) = tdpI(2) + (obXn(2)-1)*Fd3b; count = 1; - dZ = [-1 1 -NR NR]; - - [ign, ir] = sort(rand(1,4)); - for step = 0:min(cutoff,maxpathlen) - if count < 1, break, end - N = count; - z = znext; - count = 0; - for i = 1:N - zi = z(i); - for s=1:4 - Z = zi + dZ(ir(s)); - tag = C(Z); - if tag == -2 - PZ(Z) = zi; - path = traceback(Z,PZ,NR,step+1); - return - end - if tag == -1 && B(Z) == 0 - C(Z) = step+1; - PZ(Z) = zi; - count = count + 1; - znext(count) = Z; - end - end - end + VW1D = [-1 1 -Fd3b Fd3b]; + csDp = randperm(4); + for step = 0:min(p8Xc,THgh) + if count < 1, break, end + yLXP = count; + uVKw = l2Hd; + count = 0; + for Naeu = 1:yLXP + wGfT = uVKw(Naeu); + for gSjj=1:4 + A8mr = wGfT + VW1D(csDp(gSjj)); + iYoI = z6WH(A8mr); + if iYoI == -2 + yJJG(A8mr) = wGfT; + path = YwNf(A8mr,yJJG,Fd3b,step+1); + return end + if iYoI == -1 && B(A8mr) == 0 + z6WH(A8mr) = step+1; + yJJG(A8mr) = wGfT; + count = count + 1; + l2Hd(count) = A8mr; + end + end + end + end path = []; end - - %% - function path = bridgepath(B,BH,BV,row,col,label,maxbridges,kappa,maxpathlen) - - % - bridgepath - - % fprintf('bridgepath ...\n'); - [NR NC] = size(B); - BRIDGE = false(NR,NC); - PZ = zeros(NR,NC); - C = -ones(NR,NC); - % C(row(2),col(2)) = 0; % source - - % tag targets - C(row(1),col(1)) = -2; - C( B == label ) = -2; - - maxstep = min((maxbridges*27)+kappa,maxpathlen+1); - nextstep = zeros(maxstep+28,1); - nextstep(1) = row(2) + (col(2)-1)*NR; - dZ = [-NR NR -1 1]; - + function path = alrK(B,UGqt,lirh,tdpI,obXn,pmPS,CHo9,cp3C,THgh) + [Fd3b LeaN] = size(B); + EYWc = false(Fd3b,LeaN); + yJJG = zeros(Fd3b,LeaN); + z6WH = -ones(Fd3b,LeaN); + z6WH(tdpI(1),obXn(1)) = -2; + z6WH( B == pmPS ) = -2; + maxstep = min((CHo9*27)+cp3C,THgh+1); + xi43 = zeros(maxstep+28,1); + xi43(1) = tdpI(2) + (obXn(2)-1)*Fd3b; + VW1D = [-Fd3b Fd3b -1 1]; for step = 1:maxstep - while nextstep(step)>0 - zi = nextstep(step); - nextstep(step)=C(zi); - for s = 1:4 - Z = zi + dZ(s); - tag = C(Z); - if tag==-1 - if B(Z) == 0 - C(Z) = nextstep(step+1); - nextstep(step+1) = Z; - PZ(Z) = zi; - elseif (BH(Z)&&(s<3)) || (BV(Z)&&(s>2)) - C(Z) = nextstep(step+26); - nextstep(step+26) = Z; - PZ(Z) = zi; - BRIDGE(Z) = true; - end - end - if tag==-2 - step=step+1; - PZ(Z) = zi; - dr=mod(Z,NR); - dc=ceil(Z/NR); - path = zeros(step,4); - j = 0; - while dr ~= row(2) || dc ~= col(2) - j = j + 1; - path(j,1:2) = [dr dc]; - Z = dr + (dc-1)*NR; - pz = PZ(Z); - pr=mod(pz,NR); - pc=ceil(pz/NR); - path(j,3:4) = [pr pc]; - dr = pr; - dc = pc; - if BRIDGE(dr,dc) - j = j + 1; - path(j,:) = [dr dc dr dc]; - end - end - path = path(1:j,:); - return - end - - end - end + while xi43(step)>0 + wGfT = xi43(step); + xi43(step)=z6WH(wGfT); + for gSjj = 1:4 + A8mr = wGfT + VW1D(gSjj); + iYoI = z6WH(A8mr); + if iYoI==-1 + if B(A8mr) == 0 + z6WH(A8mr) = xi43(step+1); + xi43(step+1) = A8mr; + yJJG(A8mr) = wGfT; + elseif (UGqt(A8mr)&&(gSjj<3)) || (lirh(A8mr)&&(gSjj>2)) + z6WH(A8mr) = xi43(step+26); + xi43(step+26) = A8mr; + yJJG(A8mr) = wGfT; + EYWc(A8mr) = true; end + end + if iYoI==-2 + step=step+1; + yJJG(A8mr) = wGfT; + eoU8=mod(A8mr,Fd3b); + MILc=ceil(A8mr/Fd3b); + path = zeros(step,4); + f_kg = 0; + while eoU8 ~= tdpI(2) || MILc ~= obXn(2) + f_kg = f_kg + 1; + path(f_kg,1:2) = [eoU8 MILc]; + A8mr = eoU8 + (MILc-1)*Fd3b; + pgXP = yJJG(A8mr); + ON_M=mod(pgXP,Fd3b); + ozCg=ceil(pgXP/Fd3b); + path(f_kg,3:4) = [ON_M ozCg]; + eoU8 = ON_M; + MILc = ozCg; + if EYWc(eoU8,MILc) + f_kg = f_kg + 1; + path(f_kg,:) = [eoU8 MILc eoU8 MILc]; + end + end + path = path(1:f_kg,:); + return + end + end + end + end path = []; end - - - function W = solverF(B) - [W,S] = function1(B); - IN55LEuuYN = 0; - d2F7TC2nTS = round(mod(B(:),2)); - if S < 2100 - return + function W = Vlcd(B) + [W,IAFL] = vc25(B); + Zf8a = 0; + b9XB = round(mod(B(:),2)); + if IAFL < 2100 + return end - [kJfcOitU9b,ZqDtJmqMeb] = size(B); + [zn5Z,yZ3T] = size(B); B = flipud(fliplr(B')); - [zElIwYjTOJ,FZzcxpyenz] = function1(B); - if S > FZzcxpyenz - W = [kJfcOitU9b-zElIwYjTOJ(:,2)+1 ZqDtJmqMeb-zElIwYjTOJ(:,1)+1 kJfcOitU9b-zElIwYjTOJ(:,4)+1 ZqDtJmqMeb-zElIwYjTOJ(:,3)+1]; + [cWEw,jpqK] = vc25(B); + if IAFL > jpqK + W = [zn5Z-cWEw(:,2)+1 yZ3T-cWEw(:,1)+1 zn5Z-cWEw(:,4)+1 yZ3T-cWEw(:,3)+1]; end - if d2F7TC2nTS~=IN55LEuuYN; W = zeros(0,4); end + if b9XB~=Zf8a; W = zeros(0,4); end end - - function [W,S] = function1(B) - [nR,nC]=size(B); - Bpad=nan(nR+2,nC+2); - Bpad(2:end-1,2:end-1)=B; - Bedit = Bpad; - maxbridges = 4; - if size(Bedit,2) > 20 - cutfirst = 4; - cutsecond = 8; - cutoff = 12; + function [W,IAFL] = vc25(B) + [h_yD,DXG1]=size(B); + hBgc=nan(h_yD+2,DXG1+2); + hBgc(2:end-1,2:end-1)=B; + dFwL = hBgc; + CHo9 = 4; + if size(dFwL,2) > 20 + Lvih = 4; + GhOJ = 8; + p8Xc = 12; else - cutfirst = 3; - cutsecond = 7; - cutoff = 11; + Lvih = 3; + GhOJ = 7; + p8Xc = 11; end - S = inf; - X1 = [1 2;2 1]; - X2 = [1 3;3 1]; - Y = [3 2 1;1 2 3]; - for x = 1:2 - if x == 2 - [U BU] = phase1_a(Bedit,cutfirst,X1(x,:)); - [UU BUU] = phase3a(BU,U,cutsecond,X2(x,:)); - [V BX] = phase3a(BUU,UU,cutoff,X2(x,:)); - else - [U BU] = phase1_a(Bedit,4,X1(x,:)); - [V BX] = phase3a(BU,U,11,X2(x,:)); - end - for y = 1:2 - if x == 2 && y == 2 && S > 2100, return, end - W1 = phase2_a(Bedit,BX,V,maxbridges,cutoff,Y(y,:))-1; - S1 = mygrade(B,W1); - if S1 <= S - S = S1; - W = W1; - maxbridges = maxbridges - 1; - end - end + IAFL = inf; + U_IB = [1 2;2 1]; + bq_l = [1 3;3 1]; + qyL0 = [3 2 1;1 2 3]; + for SNU7 = 1:2 + if SNU7 == 2 + [RRqd kOmM] = AuFW(dFwL,Lvih,U_IB(SNU7,:)); + [YZ9f kCRf] = PMaQ(kOmM,RRqd,GhOJ,bq_l(SNU7,:)); + [dnSz MmBp] = PMaQ(kCRf,YZ9f,p8Xc,bq_l(SNU7,:)); + else + [RRqd kOmM] = AuFW(dFwL,4,U_IB(SNU7,:)); + [dnSz MmBp] = PMaQ(kOmM,RRqd,11,bq_l(SNU7,:)); end - if nR*nC > 290; return; end - br = sum(W(:,1)==W(:,3)&W(:,2)==W(:,4)); - if br <= 4 - WSH = solverSHa(B); - ssh = mygrade(B,WSH); - if ssh < S - W = WSH; - S = ssh; - end + for TMwV = 1:2 + if SNU7 == 2 && TMwV == 2 && IAFL > 2100, return, end + UG5r = uXwe(dFwL,MmBp,dnSz,CHo9,p8Xc,qyL0(TMwV,:))-1; + K9OR = r2Sj(B,UG5r); + if K9OR <= IAFL + IAFL = K9OR; + W = UG5r; + CHo9 = CHo9 - 1; end end - - - function path = complexpath_a(B,row,col,label,cutoff,maxpathlen) - function path = traceback_a(r,c,pathLength) - pR(r,c) = zR(i); - pC(r,c) = zC(i); - path = zeros(pathLength,4); - for jjj = 1:pathLength - path(jjj,1:2) = [r c]; - preR = pR(r,c); - preC = pC(r,c); - path(jjj,3:4) = [preR preC]; - r = preR; - c = preC; end + if h_yD*DXG1 > 290; return; end + fqH8 = sum(W(:,1)==W(:,3)&W(:,2)==W(:,4)); + if fqH8 <= 4 + LfTF = k5Y3(B); + tbtB = r2Sj(B,LfTF); + if tbtB < IAFL + W = LfTF; + IAFL = tbtB; end - [NR NC] = size(B); - pR = zeros(NR,NC); - pC = zeros(NR,NC); - C = -ones(NR,NC); - C(row(2),col(2)) = 0; - C(row(1),col(1)) = -2; - C( B == label ) = -2; - rnext = zeros(NR*NC,1); - cnext = zeros(NR*NC,1); + end + end + function path = H8Al(B,tdpI,obXn,pmPS,p8Xc,THgh) + function path = l6JL(hAYI,Abas,XEIH) + LLYz(hAYI,Abas) = GbkR(Naeu); + za_x(hAYI,Abas) = VNkd(Naeu); + path = zeros(XEIH,4); + for Osul = 1:XEIH + path(Osul,1:2) = [hAYI Abas]; + EnGy = LLYz(hAYI,Abas); + dcFT = za_x(hAYI,Abas); + path(Osul,3:4) = [EnGy dcFT]; + hAYI = EnGy; + Abas = dcFT; + end + end + [Fd3b LeaN] = size(B); + LLYz = zeros(Fd3b,LeaN); + za_x = zeros(Fd3b,LeaN); + z6WH = -ones(Fd3b,LeaN); + z6WH(tdpI(2),obXn(2)) = 0; + z6WH(tdpI(1),obXn(1)) = -2; + z6WH( B == pmPS ) = -2; + Llv1 = zeros(Fd3b*LeaN,1); + BXll = zeros(Fd3b*LeaN,1); count = 1; - rnext(1) = row(2); - cnext(1) = col(2); - dR=[-1 1 0 0]; - dC=[0 0 -1 1]; - for step = 0:min(cutoff,maxpathlen) - if count < 1, break, end - N = count; - zR = rnext; - zC = cnext; - count = 0; - for i = 1:N - Aa2p_xqlDq = zC(i); - zi = zR(i); - for s=1:4 - r = zi + dR(s); - c = Aa2p_xqlDq + dC(s); - Z = r + (c-1)*NR; - tag = C(Z); - if tag == -2 - path = traceback_a(r,c,step+1); - return - elseif tag == -1 && B(Z) == 0 - C(Z) = step+1; - pR(Z) = zi; - pC(Z) = Aa2p_xqlDq; - count = count + 1; rnext(count) = r; cnext(count) = c; - end - end - end + Llv1(1) = tdpI(2); + BXll(1) = obXn(2); + h1Wj=[-1 1 0 0]; + hAcH=[0 0 -1 1]; + for step = 0:min(p8Xc,THgh) + if count < 1, break, end + yLXP = count; + GbkR = Llv1(1:yLXP); + VNkd = BXll(1:yLXP); + count = 0; + for Naeu = 1:yLXP + LA_B = VNkd(Naeu); + wGfT = GbkR(Naeu); + for gSjj=1:4 + hAYI = wGfT + h1Wj(gSjj); + Abas = LA_B + hAcH(gSjj); + A8mr = hAYI + (Abas-1)*Fd3b; + iYoI = z6WH(A8mr); + if iYoI == -2 + path = l6JL(hAYI,Abas,step+1); + return + elseif iYoI == -1 && B(A8mr) == 0 + z6WH(A8mr) = step+1; + LLYz(A8mr) = wGfT; + za_x(A8mr) = LA_B; + count = count + 1; Llv1(count) = hAYI; BXll(count) = Abas; end + end + end + end path = []; end - - - - - function w = solverSHa(b) - p = unique(b); - p(1) = []; - n = zeros(size(p)); - for i = 1:length(n) - n(i) = nnz(p(i) == b(:)); + function nSWO = k5Y3(Zi5w) + ET7Q = unique(Zi5w); + ET7Q(1) = []; + lQOM = zeros(size(ET7Q)); + for Naeu = 1:length(lQOM) + lQOM(Naeu) = nnz(ET7Q(Naeu) == Zi5w(:)); end - for i = 1:length(n) - if n(i) == 1 - b(p(i) == b(:)) = -1; - end + for Naeu = 1:length(lQOM) + if lQOM(Naeu) == 1 + Zi5w(ET7Q(Naeu) == Zi5w(:)) = -1; end - g = zeros(size(b)+2); - bb = repmat(-1,size(g)); - bb(2:end-1,2:end-1) = b; - w = []; - [rr, cc] = find(bb>0); - d = (size(bb,1)/2 - rr).^2 + (size(bb,2)/2 - cc).^2; - [d, order] = sort(d); + end + v03f = zeros(size(Zi5w)+2); + d9Ju = repmat(-1,size(v03f)); + d9Ju(2:end-1,2:end-1) = Zi5w; + nSWO = []; + [SYd9, oXUf] = find(d9Ju>0); + LgOf = (size(d9Ju,1)/2 - SYd9).^2 + (size(d9Ju,2)/2 - oXUf).^2; + [LgOf, order] = sort(LgOf); order = order'; - for k = 1:length(rr)-1 - bestscore = 0; - minsteps = 32; - for i = order - if g(rr(i), cc(i)) - continue - end - [score, mv, steps] = findBestMove_a(bb, g, rr(i), cc(i), minsteps); - if score > bestscore - bestscore = score; - bestmove = mv; - minsteps = steps; - if minsteps == 1 - break - end - end - end - if bestscore == 0 - w = w - 1; - return - end - g = addwirepath(g, bestmove, bb(bestmove(1,1), bestmove(1,2))); - bb = addwirepath(bb, bestmove, bb(bestmove(1,1), bestmove(1,2))); - w = [w; bestmove]; + for f2kZ = 1:length(SYd9)-1 + DOO2 = 0; + vquX = 32; + for Naeu = order + if v03f(SYd9(Naeu), oXUf(Naeu)) + continue end - w = w - 1; + [jQ_m, RxYJ, EL2U] = XH7h(d9Ju, v03f, SYd9(Naeu), oXUf(Naeu), vquX); + if jQ_m > DOO2 + DOO2 = jQ_m; + fZxu = RxYJ; + vquX = EL2U; + if vquX == 1 + break end - - - function [bestscore, bestmove, minsteps] = findBestMove_a(b, g, z, zC, tniOHnFTWS) - bestscore = 0; - bestmove = []; - jjj = [1 -1 0 0]; - k = [0 0 1 -1]; - if ~any(g(:)==b(z,zC)) - g = b; end - bb = b; - bb(bb>0) = -1; - bb(z,zC) = 1; - minsteps = Inf; - p = b(z,zC); - for i = 1:tniOHnFTWS-2 - [rr, cc] = find(bb==i); - for n = 1:length(rr) - for GEOY9vqvEy = 1:4 - Cw4BfzRNQ6 = rr(n) + jjj(GEOY9vqvEy); - qpF1lfOV53 = cc(n) + k(GEOY9vqvEy); - if g(Cw4BfzRNQ6,qpF1lfOV53) == p && ~(Cw4BfzRNQ6 == z && qpF1lfOV53 == zC) - minsteps = i; - break - end - wzyazJbPVF = bb(Cw4BfzRNQ6,qpF1lfOV53); - if wzyazJbPVF == 0 - bb(Cw4BfzRNQ6,qpF1lfOV53) = i+1; - end - end - if minsteps < Inf - break - end - end - if minsteps < Inf - break - end end - if minsteps == Inf - return + if DOO2 == 0 + nSWO = nSWO - 1; + return end - bestscore = b(z,zC) - minsteps; - if minsteps == 1 - bestmove = [z, zC, Cw4BfzRNQ6, qpF1lfOV53]; - return + v03f = Qr5n(v03f, fZxu, d9Ju(fZxu(1,1), fZxu(1,2))); + d9Ju = Qr5n(d9Ju, fZxu, d9Ju(fZxu(1,1), fZxu(1,2))); + nSWO = [nSWO; fZxu]; end - bestmove = zeros(minsteps,4); - for step = minsteps:-1:1 - for GEOY9vqvEy = 1:4 - RugyNPRQTT = Cw4BfzRNQ6 + jjj(GEOY9vqvEy); - Wlfr8gQkkJ = qpF1lfOV53 + k(GEOY9vqvEy); - if bb(RugyNPRQTT, Wlfr8gQkkJ) == step - break - end - end - bestmove(step,:) = [RugyNPRQTT, Wlfr8gQkkJ, Cw4BfzRNQ6, qpF1lfOV53]; - Cw4BfzRNQ6 = RugyNPRQTT; - qpF1lfOV53 = Wlfr8gQkkJ; + nSWO = nSWO - 1; end + function [DOO2, fZxu, vquX] = XH7h(Zi5w, v03f, uVKw, VNkd, eGNd) + DOO2 = 0; + fZxu = []; + Osul = [1 -1 0 0]; + f2kZ = [0 0 1 -1]; + if ~any(v03f(:)==Zi5w(uVKw,VNkd)) + v03f = Zi5w; end - - - function [W B] = phase1_a(B,cutoff,rz) + d9Ju = Zi5w; + d9Ju(d9Ju>0) = -1; + d9Ju(uVKw,VNkd) = 1; + vquX = Inf; + ET7Q = Zi5w(uVKw,VNkd); + for Naeu = 1:eGNd-2 + [SYd9, oXUf] = find(d9Ju==Naeu); + for lQOM = 1:length(SYd9) + for b2cY = 1:4 + EsXd = SYd9(lQOM) + Osul(b2cY); + EJhp = oXUf(lQOM) + f2kZ(b2cY); + if v03f(EsXd,EJhp) == ET7Q && ~(EsXd == uVKw && EJhp == VNkd) + vquX = Naeu; + break + end + GcNz = d9Ju(EsXd,EJhp); + if GcNz == 0 + d9Ju(EsXd,EJhp) = Naeu+1; + end + end + if vquX < Inf + break + end + end + if vquX < Inf + break + end + end + if vquX == Inf + return + end + DOO2 = Zi5w(uVKw,VNkd) - vquX; + if vquX == 1 + fZxu = [uVKw, VNkd, EsXd, EJhp]; + return + end + fZxu = zeros(vquX,4); + for step = vquX:-1:1 + for b2cY = 1:4 + QIEO = EsXd + Osul(b2cY); + t6uz = EJhp + f2kZ(b2cY); + if d9Ju(QIEO, t6uz) == step + break + end + end + fZxu(step,:) = [QIEO, t6uz, EsXd, EJhp]; + EsXd = QIEO; + EJhp = t6uz; + end + end + function [W B] = AuFW(B,p8Xc,m1qh) W = []; - [pincount k] = analyzeboard(B,rz); - if k < 1 - return + [NRBI f2kZ] = PDwY(B,m1qh); + if f2kZ < 1 + return end - pincount=sortrows(pincount,-rz); - for i = 1:k - if pincount(i,2) >= 2 - p = pincount(i,1); - [row col] = find(B == p); - N = size(row,1); - Npairs = N*(N-1)/2; - dist = zeros(Npairs,3); - x = 0; - for a = 1:N - for b = (a+1):N - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row(a)-row(b)) + abs(col(a)-col(b)); - end - end - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - qfUlAeE6ke = reshape(dist(:,1:2)',[],1); - npins = 0; - qYyU89IINf = 1; - OEmC4q5N3Q = false(N,1); - for i=1:N - lNue6SeFoq = find( ~OEmC4q5N3Q(qfUlAeE6ke(qYyU89IINf:end)) , 1 , 'first'); - if isempty(lNue6SeFoq) - break - end - a = qfUlAeE6ke(lNue6SeFoq); - Distance = abs(row([1:a-1,a+1:end]')-row(a)) + abs(col([1:a-1,a+1:end]')-col(a)); - if max(Distance)>cutoff-1 - break - end - path = DqbHRtn5ft(B,row(a),col(a),row([1:a-1,a+1:end]'),col([1:a-1,a+1:end]'), -p, cutoff, 2*p); - if size(path,1) > 0 - W = [W; path]; - B = addwirepath(B,path,-p); - npins = 2; - break - end - end - if npins < 2 - continue - end - for jjj = 3:N - [row2 col2] = find(B == -p); - [row col] = find(B == p); - [AM3xhXGopY,pXUGUzzwiB] = meshgrid(row,row2); - [sb9p2RYeiU,Je3dFDJNL9] = meshgrid(row,row2); - Distance = abs(AM3xhXGopY-pXUGUzzwiB) + abs(sb9p2RYeiU-Je3dFDJNL9); - if max(Distance(:))>cutoff-1 - break - end - path = DqbHRtn5ft(B,row2,col2,row,col, -p, cutoff, 2*p); - if size(path,1) > 0 - W = [W; path]; - B = addwirepath(B,path,-p); - connected = true; - else - break - end - end - end + NRBI=sortrows(NRBI,-m1qh); + for Naeu = 1:f2kZ + if NRBI(Naeu,2) >= 2 + ET7Q = NRBI(Naeu,1); + [tdpI obXn] = find(B == ET7Q); + yLXP = size(tdpI,1); + eS_w = yLXP*(yLXP-1)/2; + dist = zeros(eS_w,3); + SNU7 = 0; + for B3cr = 1:yLXP + for Zi5w = (B3cr+1):yLXP + SNU7 = SNU7 + 1; + dist(SNU7,1) = B3cr; + dist(SNU7,2) = Zi5w; + dist(SNU7,3) = abs(tdpI(B3cr)-tdpI(Zi5w)) + abs(obXn(B3cr)-obXn(Zi5w)); end end - - - function [W B] = phase3a(B,W,XDfVAc3Mmp,rz) - [pincount k] = analyzeboard(B,rz); - if k < 1, return, end - pincount=sortrows(pincount,-rz); - for i = 1:k - p = pincount(i,1); - Npinwires = sum(B == -p); - if Npinwires == 0 - if pincount(i,2) >= 2 - [row col] = find(B == p); - N = size(row,1); - Npairs = N*(N-1)/2; - dist = zeros(Npairs,3); - x = 0; - for a = 1:N - for b = (a+1):N - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row(a)-row(b)) + abs(col(a)-col(b)); - end - end - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - maxstep = min(XDfVAc3Mmp,2*p+1); - connected = false; - for x = 1:Npairs - if dist(x,3) > maxstep+1 - break - end - a = dist(x,1); - b = dist(x,2); - path = complexpath_a(B,[row(a); row(b)], [col(a); col(b)], -p, XDfVAc3Mmp, 2*p); - if size(path,1) > 0 - W = [W; path]; - B = addwirepath(B,path,-p); - connected = true; - break - end - end - if ~connected - continue - end - end - end - [row col] = find(B == p); - wibFptvq9Y = size(row,1); - maxstep = min(XDfVAc3Mmp,p+1); - for jjj = 1:wibFptvq9Y - [row2 col2] = find(B == -p); - [row col] = find(B == p); - connected = false; - path = DqbHRtn5ft(B,row2,col2,row,col, -p, XDfVAc3Mmp, p); - if size(path,1) > 0 - W = [W; path]; - B = addwirepath(B,path,-p); - connected = true; - end - if ~connected - break - end - end + [LgOf RQMk] = sort(dist(:,3)); + dist = dist(RQMk,:); + mMJX = reshape(dist(:,1:2)',[],1); + B_bx = 0; + nZYN = 1; + aOBV = false(yLXP,1); + for Naeu=1:yLXP + RCF1 = find( ~aOBV(mMJX(nZYN:end)) , 1 , 'first'); + if isempty(RCF1) + break end + B3cr = mMJX(RCF1); + Distance = abs(tdpI([1:B3cr-1,B3cr+1:end]')-tdpI(B3cr)) + abs(obXn([1:B3cr-1,B3cr+1:end]')-obXn(B3cr)); + if max(Distance)>p8Xc-1 + break end - - - function [W B] = phase2_a(Bpad,B,W,maxbridges,XDfVAc3Mmp,rz) - function hr2OdLy5K5() - for w = 1:size(path,1); - if path(w,1) == path(w,3) - YTx56DA5U8(path(w,1),path(w,2)) = false; - YTx56DA5U8(path(w,3),path(w,4)) = false; - if path(w,2) == path(w,4) - B(path(w,1),path(w,2)) = -9999; - end - end - if path(w,2) == path(w,4) - P9_FTG1hds(path(w,1),path(w,2)) = false; - P9_FTG1hds(path(w,3),path(w,4)) = false; - end + path = NdoG(B,tdpI(B3cr),obXn(B3cr),tdpI([1:B3cr-1,B3cr+1:end]'),obXn([1:B3cr-1,B3cr+1:end]'), -ET7Q, p8Xc, 2*ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + B_bx = 2; + break end end - [YTx56DA5U8 P9_FTG1hds] = buildbridges(Bpad,B,W); - [pincount k] = analyzeboard(B,rz); - if k < 1, return, end - pincount=sortrows(pincount,-rz); - for i = 1:k - p = pincount(i,1); - Npinwires = sum(B == -p); - if Npinwires == 0 - if pincount(i,2) >= 2 - [row col] = find(B == p); - N = size(row,1); - Npairs = N*(N-1)/2; - dist = zeros(Npairs,3); - x = 0; - for a = 1:N - for b = (a+1):N - x = x + 1; - dist(x,1) = a; - dist(x,2) = b; - dist(x,3) = abs(row(a)-row(b)) + abs(col(a)-col(b)); - end - end - [d ix] = sort(dist(:,3)); - dist = dist(ix,:); - maxstep = min((maxbridges*25)+XDfVAc3Mmp,2*p+1); - connected = false; - for x = 1:Npairs - if dist(x,3) > maxstep+1 - break - end - a = dist(x,1); - b = dist(x,2); - path = bridgepath(B,YTx56DA5U8,P9_FTG1hds,[row(a); row(b)], [col(a); col(b)], -p, maxbridges, XDfVAc3Mmp, 2*p); - if size(path,1) > 0 - W = [W; path]; - B = addwirepath(B,path,-p); - hr2OdLy5K5(); - connected = true; - break - end - end - if ~connected - continue - end - end - end - row = find(B == p); - wibFptvq9Y = size(row,1); - % maxstep = min((maxbridges*25)+XDfVAc3Mmp,p+1); - for jjj = 1:wibFptvq9Y - z2 = find(B == -p); - z = find(B == p); - connected = false; - path = d4TZerDbiG(B,YTx56DA5U8,P9_FTG1hds,z2,z, maxbridges, XDfVAc3Mmp, p); - if size(path,1) > 0 - W = [W; path]; - B = addwirepath(B,path,-p); - hr2OdLy5K5(); - connected = true; - end - if ~connected - break - end - end + if B_bx < 2 + continue end + for Osul = 3:yLXP + [Z_Xc w8iv] = find(B == -ET7Q); + [tdpI obXn] = find(B == ET7Q); + [oWD4,H_4Z] = meshgrid(tdpI,Z_Xc); + [E49U,ksi2] = meshgrid(tdpI,Z_Xc); + Distance = abs(oWD4-H_4Z) + abs(E49U-ksi2); + if max(Distance(:))>p8Xc-1 + break end - - %% - function path = d4TZerDbiG(B,BH,BV,zS,zT,maxbridges,kappa,maxpathlen) - function path = traceback_b(Z,step) - PZ(Z) = zi; - r=mod(Z,NR); - c=ceil(Z/NR); - path = zeros(step,4); - jjj = 0; - - while ~any(zS==Z) - jjj = jjj + 1; - path(jjj,1:2) = [r c]; - Z = PZ(Z); - r=mod(Z,NR); - c=ceil(Z/NR); - path(jjj,3:4) = [r c]; - if BRIDGE(r,c) - jjj = jjj + 1; - path(jjj,:) = [r c r c]; - end - end - path = path(1:jjj,:); - end - [NR NC] = size(B); - BRIDGE = false(NR,NC); - PZ = zeros(NR,NC); - C = -ones(NR,NC); - C(zS) = 0; - C(zT) = -2; - maxstep = min((maxbridges*25)+kappa,maxpathlen+1); - nextstep = zeros(maxstep+26,1); + path = NdoG(B,Z_Xc,w8iv,tdpI,obXn, -ET7Q, p8Xc, 2*ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + I1cJ = true; + else + break + end + end + end + end + end + function [W B] = PMaQ(B,W,hSQF,m1qh) + [NRBI f2kZ] = PDwY(B,m1qh); + if f2kZ < 1, return, end + NRBI=sortrows(NRBI,-m1qh); + for Naeu = 1:f2kZ + ET7Q = NRBI(Naeu,1); + aRIF = sum(B == -ET7Q); + if aRIF == 0 + if NRBI(Naeu,2) >= 2 + [tdpI obXn] = find(B == ET7Q); + yLXP = size(tdpI,1); + eS_w = yLXP*(yLXP-1)/2; + dist = zeros(eS_w,3); + SNU7 = 0; + for B3cr = 1:yLXP + for Zi5w = (B3cr+1):yLXP + SNU7 = SNU7 + 1; + dist(SNU7,1) = B3cr; + dist(SNU7,2) = Zi5w; + dist(SNU7,3) = abs(tdpI(B3cr)-tdpI(Zi5w)) + abs(obXn(B3cr)-obXn(Zi5w)); + end + end + [LgOf RQMk] = sort(dist(:,3)); + dist = dist(RQMk,:); + maxstep = min(hSQF,2*ET7Q+1); + I1cJ = false; + for SNU7 = 1:eS_w + if dist(SNU7,3) > maxstep+1 + break + end + B3cr = dist(SNU7,1); + Zi5w = dist(SNU7,2); + path = H8Al(B,[tdpI(B3cr); tdpI(Zi5w)], [obXn(B3cr); obXn(Zi5w)], -ET7Q, hSQF, 2*ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + I1cJ = true; + break + end + end + if ~I1cJ + continue + end + end + end + [tdpI obXn] = find(B == ET7Q); + Z_dL = size(tdpI,1); + maxstep = min(hSQF,ET7Q+1); + for Osul = 1:Z_dL + [Z_Xc w8iv] = find(B == -ET7Q); + [tdpI obXn] = find(B == ET7Q); + I1cJ = false; + path = NdoG(B,Z_Xc,w8iv,tdpI,obXn, -ET7Q, hSQF, ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + I1cJ = true; + end + if ~I1cJ + break + end + end + end + end + function [W B] = uXwe(hBgc,B,W,CHo9,hSQF,m1qh) + function n2DH() + for nSWO = 1:size(path,1); + if path(nSWO,1) == path(nSWO,3) + pioc(path(nSWO,1),path(nSWO,2)) = false; + pioc(path(nSWO,3),path(nSWO,4)) = false; + if path(nSWO,2) == path(nSWO,4) + B(path(nSWO,1),path(nSWO,2)) = -9999; + end + end + if path(nSWO,2) == path(nSWO,4) + K5FN(path(nSWO,1),path(nSWO,2)) = false; + K5FN(path(nSWO,3),path(nSWO,4)) = false; + end + end + end + [pioc K5FN] = ce2R(hBgc,B,W); + [NRBI f2kZ] = PDwY(B,m1qh); + if f2kZ < 1, return, end + NRBI=sortrows(NRBI,-m1qh); + for Naeu = 1:f2kZ + ET7Q = NRBI(Naeu,1); + aRIF = sum(B == -ET7Q); + if aRIF == 0 + if NRBI(Naeu,2) >= 2 + [tdpI obXn] = find(B == ET7Q); + yLXP = size(tdpI,1); + eS_w = yLXP*(yLXP-1)/2; + dist = zeros(eS_w,3); + SNU7 = 0; + for B3cr = 1:yLXP + for Zi5w = (B3cr+1):yLXP + SNU7 = SNU7 + 1; + dist(SNU7,1) = B3cr; + dist(SNU7,2) = Zi5w; + dist(SNU7,3) = abs(tdpI(B3cr)-tdpI(Zi5w)) + abs(obXn(B3cr)-obXn(Zi5w)); + end + end + [LgOf RQMk] = sort(dist(:,3)); + dist = dist(RQMk,:); + maxstep = min((CHo9*25)+hSQF,2*ET7Q+1); + I1cJ = false; + for SNU7 = 1:eS_w + if dist(SNU7,3) > maxstep+1 + break + end + B3cr = dist(SNU7,1); + Zi5w = dist(SNU7,2); + path = alrK(B,pioc,K5FN,[tdpI(B3cr); tdpI(Zi5w)], [obXn(B3cr); obXn(Zi5w)], -ET7Q, CHo9, hSQF, 2*ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + n2DH(); + I1cJ = true; + break + end + end + if ~I1cJ + continue + end + end + end + [tdpI obXn] = find(B == ET7Q); + Z_dL = size(tdpI,1); + maxstep = min((CHo9*25)+hSQF,ET7Q+1); + for Osul = 1:Z_dL + [Z_Xc w8iv] = find(B == -ET7Q); + [tdpI obXn] = find(B == ET7Q); + I1cJ = false; + path = ARLF(B,pioc,K5FN,Z_Xc,w8iv,tdpI,obXn, -ET7Q, CHo9, hSQF, ET7Q); + if size(path,1) > 0 + W = [W; path]; + B = Qr5n(B,path,-ET7Q); + n2DH(); + I1cJ = true; + end + if ~I1cJ + break + end + end + end + end + function path = ARLF(B,UGqt,lirh,rowS,colS,yTV3,dGN8,pmPS,CHo9,cp3C,THgh) + function path = YwNf(A8mr,step) + yJJG(A8mr) = wGfT; + path = zeros(step,4); + f_kg = 0; + yU8N = 0; + YUoi = zeros(step,1); + wDo6 = zeros(step,1); + TBYR = zeros(step,1); + while isempty(find(tqE6==A8mr,1)) + f_kg = f_kg + 1; + YUoi(f_kg,1) = A8mr; + pgXP = yJJG(A8mr); + wDo6(f_kg,1) = pgXP; + A8mr = pgXP; + if EYWc(A8mr) + yU8N = yU8N + 1; + TBYR(yU8N,1) = A8mr; + end + end + YUoi = [ YUoi(1:f_kg,:) ; TBYR(1:yU8N,1) ]; + wDo6 = [ wDo6(1:f_kg,:) ; TBYR(1:yU8N,1) ]; + path = [ mod(YUoi,Fd3b) , ceil(YUoi/Fd3b) , mod(wDo6,Fd3b) , ceil(wDo6/Fd3b) ]; + end + [Fd3b LeaN] = size(B); + EYWc = false(Fd3b,LeaN); + yJJG = zeros(Fd3b,LeaN); + z6WH = -ones(Fd3b,LeaN); + tqE6 = rowS + (colS-1)*Fd3b; + z6WH(tqE6) = 0; + z6WH(yTV3 + (dGN8-1)*Fd3b) = -2; + maxstep = min((CHo9*25)+cp3C,THgh+1); + HcVD = zeros(maxstep+26,1); + EXtr = [-1 1]; for step = 0:maxstep - if step == 0 - z = zS; - elseif nextstep(step) == 0 - continue - else - z = find(C == step); - end - N = numel(z); - for i = 1:N - zi = z(i); - Z = zi - NR; - tag = C(Z); - if tag == -2 - path = traceback_b(Z,step+1); - return - elseif tag == -1 - if B(Z) == 0 - C(Z) = step+1; nextstep(step+1) = 1; - PZ(Z) = zi; - elseif BH(Z) - C(Z) = step+26; nextstep(step+26) = 1; - PZ(Z) = zi; - BRIDGE(Z) = true; - end - end - Z = zi + NR; - tag = C(Z); - if tag == -2 - path = traceback_b(Z,step+1); - return - elseif tag == -1 - if B(Z) == 0 - C(Z) = step+1; nextstep(step+1) = 1; - PZ(Z) = zi; - elseif BH(Z) - C(Z) = step+26; nextstep(step+26) = 1; - PZ(Z) = zi; - BRIDGE(Z) = true; - end - end - Z = zi - 1; - tag = C(Z); - if tag == -2 - path = traceback_b(Z,step+1); - return - elseif tag == -1 - if B(Z) == 0 - C(Z) = step+1; nextstep(step+1) = 1; - PZ(Z) = zi; - elseif BV(Z) - C(Z) = step+26; nextstep(step+26) = 1; - PZ(Z) = zi; - BRIDGE(Z) = true; - end - end - Z = zi + 1; - tag = C(Z); - if tag == -2 - path = traceback_b(Z,step+1); - return - elseif tag == -1 - if B(Z) == 0 - C(Z) = step+1; nextstep(step+1) = 1; - PZ(Z) = zi; - elseif BV(Z) - C(Z) = step+26; nextstep(step+26) = 1; - PZ(Z) = zi; - BRIDGE(Z) = true; - end - end - end + if step == 0 + uVKw = tqE6; + elseif HcVD(step) == 0 + continue + else + uVKw = find(z6WH == step); end + yLXP = numel(uVKw); + for Naeu = 1:yLXP + wGfT = uVKw(Naeu); + for IDf_ = 1:2 + A8mr = wGfT + EXtr(IDf_) * Fd3b; + iYoI = z6WH(A8mr); + if iYoI == -2 + path = YwNf(A8mr,step+1); + return + elseif iYoI == -1 + if B(A8mr) == 0 + z6WH(A8mr) = step+1; HcVD(step+1) = 1; + yJJG(A8mr) = wGfT; + elseif UGqt(A8mr) + z6WH(A8mr) = step+26; HcVD(step+26) = 1; + yJJG(A8mr) = wGfT; + EYWc(A8mr) = true; + end + end + end + for IDf_ = 1:2 + A8mr = wGfT + EXtr(IDf_); + iYoI = z6WH(A8mr); + if iYoI == -2 + path = YwNf(A8mr,step+1); + return + elseif iYoI == -1 + if B(A8mr) == 0 + z6WH(A8mr) = step+1; HcVD(step+1) = 1; + yJJG(A8mr) = wGfT; + elseif lirh(A8mr) + z6WH(A8mr) = step+26; HcVD(step+26) = 1; + yJJG(A8mr) = wGfT; + EYWc(A8mr) = true; + end + end + end + end + end path = zeros(0,4); end - - function path = DqbHRtn5ft(B,rowS,colS,FIg5RLlRYM,bX69T9QEhw,label,cutoff,maxpathlen) - % function path = traceback_a(r,c,pathLength) - % pR(r,c) = zR(i); - % pC(r,c) = zC(i); - % path = zeros(pathLength,4); - % for jjj = 1:pathLength - % path(jjj,1:2) = [r c]; - % preR = pR(r,c); - % preC = pC(r,c); - % path(jjj,3:4) = [preR preC]; - % r = preR; - % c = preC; - % end - % end - [NR NC] = size(B); - pR = zeros(NR,NC); - pC = zeros(NR,NC); - C = -ones(NR,NC); - C(rowS+(colS-1)*NR) = 0; - C(FIg5RLlRYM+(bX69T9QEhw-1)*NR) = -2; - znext = zeros(NR*NC,1); - cnext = zeros(NR*NC,1); + function path = NdoG(B,rowS,colS,OwhW,DAn8,pmPS,p8Xc,THgh) + [Fd3b LeaN] = size(B); + LLYz = zeros(Fd3b,LeaN); + za_x = zeros(Fd3b,LeaN); + z6WH = -ones(Fd3b,LeaN); + z6WH(rowS+(colS-1)*Fd3b) = 0; + z6WH(OwhW+(DAn8-1)*Fd3b) = -2; + l2Hd = zeros(Fd3b*LeaN,1); + BXll = zeros(Fd3b*LeaN,1); count = numel(rowS); - znext(1:count) = rowS; - cnext(1:count) = colS; - dR=[-1 1 0 0]; - dC=[0 0 -1 1]; - for step = 0:min(cutoff,maxpathlen) - if count < 1, break, end - N = count; - zR = znext; - zC = cnext; - count = 0; - for i = 1:N - Aa2p_xqlDq = zC(i); - zi = zR(i); - for s=1:4 - r = zi + dR(s); - c = Aa2p_xqlDq + dC(s); - Z = r + (c-1)*NR; - tag = C(Z); - if tag == -2 - %path = traceback_a(r,c,step+1); - pathLength=step+1; - pR(r,c) = zR(i); - pC(r,c) = zC(i); - path = zeros(pathLength,4); - for jjj = 1:pathLength - path(jjj,1:2) = [r c]; - preR = pR(r,c); - preC = pC(r,c); - path(jjj,3:4) = [preR preC]; - r = preR; - c = preC; - end - return - end - if tag == -1 && B(Z) == 0 - C(Z) = step+1; - pR(Z) = zi; - pC(Z) = Aa2p_xqlDq; - count = count + 1; znext(count) = r; cnext(count) = c; - end - end - end + l2Hd(1:count) = rowS; + BXll(1:count) = colS; + h1Wj=[-1 1 0 0]; + hAcH=[0 0 -1 1]; + for step = 0:min(p8Xc,THgh) + if count < 1, break, end + yLXP = count; + GbkR = l2Hd(1:yLXP); + VNkd = BXll(1:yLXP); + count = 0; + for Naeu = 1:yLXP + LA_B = VNkd(Naeu); + wGfT = GbkR(Naeu); + for gSjj=1:4 + hAYI = wGfT + h1Wj(gSjj); + Abas = LA_B + hAcH(gSjj); + A8mr = hAYI + (Abas-1)*Fd3b; + iYoI = z6WH(A8mr); + if iYoI == -2 + XEIH=step+1; + LLYz(hAYI,Abas) = GbkR(Naeu); + za_x(hAYI,Abas) = VNkd(Naeu); + path = zeros(XEIH,4); + for Osul = 1:XEIH + path(Osul,1:2) = [hAYI Abas]; + EnGy = LLYz(hAYI,Abas); + dcFT = za_x(hAYI,Abas); + path(Osul,3:4) = [EnGy dcFT]; + hAYI = EnGy; + Abas = dcFT; end + return + end + if iYoI == -1 && B(A8mr) == 0 + z6WH(A8mr) = step+1; + LLYz(A8mr) = wGfT; + za_x(A8mr) = LA_B; + count = count + 1; l2Hd(count) = hAYI; BXll(count) = Abas; + end + end + end + end path = []; - end+ end