| Code: | function W = solver(B)
[m,n]=size(B);
pins=sort(unique(B));
pins(1)=[];
numpins=length(pins);
for i=1:numpins
hscore(i)=sum(sum(B==pins(i)))*pins(i);
end
[tmp,si]=sort(-hscore);
pins=pins(si);
hB=[ones(1,n+2)*999999;ones(m,1)*999999 B ones(m,1)*999999;ones(1,n+2)*999999];
W=zeros(0,4);
[hW,hB]=connectpins2(hB,pins,m,n,B);
W=[W;hW];
W=W-1;
function [path,hB]=connectpins2(hB,pins,m,n,B)
numpins=length(pins);
for i=1:numpins
ucpins{i}=find(hB==pins(i));
cpins{i}=[ucpins{i}(1)];
ucpins{i}(1)=[];
end
path=zeros(0,4);
hm=m+2;
hn=n+2;
while (1)
bestplen=999999;
bestcost=999999;
bestucj=0;
bestii=0;
for ii=1:numpins
numuc=length(ucpins{ii});
numc=length(cpins{ii});
for i=1:numc
for j=1:numuc
[hlen,hipath,hcost]=findshortestpathcost(hB,cpins{ii}(i),ucpins{ii}(j),m,n);
if ( hcost<bestcost )
bestplen=hlen;
bestipath=hipath;
bestucj=j;
bestii=ii;
bestcost=hcost;
end
end
end
end
if ( bestucj>0 && bestcost<pins(bestii) )
for i=1:length(bestipath)-1
[r1,c1]=ind2sub([hm,hn],bestipath(i));
[r2,c2]=ind2sub([hm,hn],bestipath(i+1));
path=[path;r1 c1 r2 c2];
end
for i=2:length(bestipath)-1
if ( hB(bestipath(i))==-1 )
[r1,c1]=ind2sub([hm,hn],bestipath(i));
path=[path;r1 c1 r1 c1];
end
hB(bestipath(i))=-1;
end
cpins{bestii}=[cpins{bestii};ucpins{bestii}(bestucj)];
ucpins{bestii}(bestucj)=[];
else
fok=0;
for jj=1:numpins
if ( length(cpins{jj})==1 && length(ucpins{jj})>1 )
cpins{jj}(1)=ucpins{jj}(1);
ucpins{jj}(1)=[];
fok=1;
end
end
if ( ~fok )
return
end
end
end
function [len,ipath,cost]=findshortestpathcost(hB,startpin,endpin,m,n)
uv=zeros(4*m*n,1);
uvi=1;
huvi=1;
uv(1)=startpin;
threshold=hB(startpin);
hm=m+2; hn=n+2;
hBC=hB;
hBC(hBC>0)=-2;
hBC(startpin)=0;
hBC(endpin)=0;
hB(hB>0)=999999;
hB(startpin)=startpin;
hB(endpin)=0;
while ( ~hB(endpin) && uvi<=huvi )
hpin=uv(uvi)-1;
hpin2=uv(uvi)-2;
hcost=hBC(uv(uvi))+1;
if ( hB(hpin)==-1 )
hcost=hcost+26;
end
if ( hcost<threshold )
if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
hB(hpin)=uv(uvi);
hBC(hpin)=hcost;
huvi=huvi+1;
uv(huvi)=hpin;
elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
hB(hpin)=uv(uvi);
hB(hpin2)=hpin;
hBC(hpin2)=hcost;
huvi=huvi+1;
uv(huvi)=hpin2;
end
end
hpin=uv(uvi)+1;
hpin2=uv(uvi)+2;
hcost=hBC(uv(uvi))+1;
if ( hB(hpin)==-1 )
hcost=hcost+26;
end
if ( hcost<threshold )
if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
hB(hpin)=uv(uvi);
hBC(hpin)=hcost;
huvi=huvi+1;
uv(huvi)=hpin;
elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
hB(hpin)=uv(uvi);
hB(hpin2)=hpin;
hBC(hpin2)=hcost;
huvi=huvi+1;
uv(huvi)=hpin2;
end
end
hpin=uv(uvi)+hm;
hpin2=uv(uvi)+2*hm;
hcost=hBC(uv(uvi))+1;
if ( hB(hpin)==-1 )
hcost=hcost+26;
end
if ( hcost<threshold )
if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
hB(hpin)=uv(uvi);
hBC(hpin)=hcost;
huvi=huvi+1;
uv(huvi)=hpin;
elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
hB(hpin)=uv(uvi);
hB(hpin2)=hpin;
hBC(hpin2)=hcost;
huvi=huvi+1;
uv(huvi)=hpin2;
end
end
hpin=uv(uvi)-hm;
hpin2=uv(uvi)-2*hm;
hcost=hBC(uv(uvi))+1;
if ( hB(hpin)==-1 )
hcost=hcost+26;
end
if ( hcost<threshold )
if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
hB(hpin)=uv(uvi);
hBC(hpin)=hcost;
huvi=huvi+1;
uv(huvi)=hpin;
elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
hB(hpin)=uv(uvi);
hB(hpin2)=hpin;
hBC(hpin2)=hcost;
huvi=huvi+1;
uv(huvi)=hpin2;
end
end
uvi=uvi+1;
end
len=0;
ipath=[];
if ( ~hB(endpin) )
len=999999;
cost=999999;
return;
end
cost=hBC(endpin);
while ( endpin ~= startpin )
ipath=[ipath;endpin];
endpin=hB(endpin);
len=len+1;
end
ipath=[ipath;endpin];
|