| 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]=connectpins(hB,currpin,m,n)
ucpins=find(hB==currpin);
cpins=[ucpins(1)];
ucpins(1)=[];
numuc=length(ucpins);
numc=1;
path=zeros(0,4);
hm=m+2;
hn=n+2;
while (numuc>0)
bestplen=999999;
bestcost=999999;
bestucj=0;
for i=1:numc
for j=1:numuc
[hlen,hipath,hcost]=findshortestpathcost(hB,cpins(i),ucpins(j),m,n);
if ( hcost<bestcost )
bestplen=hlen;
bestipath=hipath;
bestucj=j;
bestcost=hcost;
end
end
end
if ( bestucj>0 && bestcost<currpin )
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))<0) && (hB(bestipath(i))~=-999999) )
[r1,c1]=ind2sub([hm,hn],bestipath(i));
path=[path;r1 c1 r1 c1];
end
hB(bestipath(i))=-currpin;
end
cpins=[cpins;ucpins(bestucj)];
ucpins(bestucj)=[];
numuc=numuc-1;
numc=numc+1;
else
if ( length(cpins)>1 || length(ucpins)>1 )
return
end
cpins(1)=ucpins(1);
ucpins(1)=[];
numuc=numuc-1;
end
end
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))<0 && hB(bestipath(i))~=-999999 && hB(bestipath(i))~=-pins(bestii))
[r1,c1]=ind2sub([hm,hn],bestipath(i));
path=[path;r1 c1 r1 c1];
end
hB(bestipath(i))=-pins(bestii);
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 [path,hB]=connectpins3(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))<0) && (hB(bestipath(i))~=-999999) )
[r1,c1]=ind2sub([hm,hn],bestipath(i));
path=[path;r1 c1 r1 c1];
end
hB(bestipath(i))=-pins(bestii);
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;
currpin=hB(startpin);
threshold=hB(startpin);
hm=m+2; hn=n+2;
hBC=hB;
hBO=hB;
hBC(hBC>0)=-999999;
hBC(startpin)=1;
hBC(endpin)=0;
hB(hB>0)=999999;
hB(startpin)=startpin;
hB(endpin)=0;
while ( ~hB(endpin) && uvi<=huvi )
for jj=1:4
if ( jj==1 )
hpin=uv(uvi)-1;
hpin2=uv(uvi)-2;
elseif ( jj==2 )
hpin=uv(uvi)+1;
hpin2=uv(uvi)+2;
elseif ( jj==3 )
hpin=uv(uvi)+hm;
hpin2=uv(uvi)+2*hm;
else
hpin=uv(uvi)-hm;
hpin2=uv(uvi)-2*hm;
end
hcost=hBC(uv(uvi))+1;
if ( hB(hpin)<0 && hB(hpin)~=-999999 )
if ( hBO(hpin) == -currpin )
hcost=hBC(uv(uvi));
else
hcost=hcost+26;
end
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 ( hBO(hpin)==-currpin && hcost<hBC(hpin) )
hB(hpin)=uv(uvi);
hBC(hpin)=hcost;
huvi=huvi+1;
uv(huvi)=hpin;
elseif ( hB(hpin)<0 && hB(hpin)~=-999999 && hB(hpin2)==0 )
hB(hpin)=uv(uvi);
hB(hpin2)=hpin;
hBC(hpin2)=hcost;
huvi=huvi+1;
uv(huvi)=hpin2;
end
end
end
uvi=uvi+1;
end
len=0;
ipath=zeros(100,1);
if ( ~hB(endpin) )
len=999999;
cost=999999;
return;
end
cost=hBC(endpin)-1;
while ( endpin ~= startpin )
len=len+1;
ipath(len)=endpin;
endpin=hB(endpin);
end
ipath(len+1)=endpin;
ipath=ipath(1:len+1); |