ID:45657
Title:Solder
Author:Nick Howe
Date:2008-04-30 14:21:19
Score:29421.2927
Result:294189.00 (cyc: 6, node: 332)
CPU Time:0.4484
Status:Passed
Comments:Low-hanging fruit.
Based on:none
Code:
% Author:  Nick Howe

function W = solder(B)

[nrow,ncol] = size(B);
xB(1:2:2*nrow,1:2:2*ncol) = B;
[Bi,Bj,Bv] = find(xB);
%allV = unique(Bv);
%xB(2:2:end,2:2:end) = nan;
%for v = fliplr(allV')
%end;
for i = 1:numel(Bi)
    v = xB(Bi(i),Bj(i));
    down = find(xB(Bi(i)+1:end,Bj(i)),1);
    right = find(xB(Bi(i),Bj(i)+1:end),1);
    if ~isempty(down)&(xB(Bi(i)+down,Bj(i))==v)
        xB = connect(xB,Bi(i),Bj(i),Bi(i)+down,Bj(i));
    elseif ~isempty(right)&(xB(Bi(i),Bj(i)+right)==v)
        xB = connect(xB,Bi(i),Bj(i),Bi(i),Bj(i)+right);
    end;
end;
W = convertSol(xB);
end


function W = convertSol(xB)
v = xB(2:2:end,1:2:end);
h = xB(1:2:end,2:2:end);
b = xB(1:2:end,1:2:end);
[vi,vj] = find(v~=0);
[hi,hj] = find(h~=0);
[bi,bj] = find(isinf(b));
W = [vi vj vi+1 vj; hi hj hi hj+1; bi bj bi bj];
end


function xB = connect(xB,r1,c1,r2,c2)
if (r1==r2)
    xB(r1,c1:c2) = xB(r1,c1);
elseif (c1==c2)
    xB(r1:r2,c1) = xB(r1,c1);
end
end