ID:45981
Title:FindWires5
Author:Claus Still
Date:2008-05-01 17:24:44
Score:17566.4939
Result:168933.00 (cyc: 21, node: 1684)
CPU Time:86.9980
Status:Passed
Comments:
Based on:none
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);