ID:45826
Title:OneBlackCat
Author:SY
Date:2008-05-01 11:54:47
Score:34128.5464
Result:341060.00 (cyc: 13, node: 867)
CPU Time:33.5141
Status:Passed
Comments:
Based on:none
Code:
function W = solver(B)



% figure
% imagesc(B)
% colorbar
% title('BB')

W=[];

sz=size(B);

steps=abs(repmat((-sz(1):sz(1))',[1 2*sz(2)+1]))+abs(repmat((-sz(2):sz(2)),[2*sz(1)+1 1]));

[ro,co]=find(B>0);

N=length(ro);

main=zeros(sz(1),sz(2),N);
stack=ones(sz(1),sz(2),4,N)*1000;

global_mask=zeros(sz);
global_mask(B>0)=1;

single_mask=main;


for i=1:N
    main(:,:,i)=steps(sz(1)-ro(i)+2:sz(1)-ro(i)+1+sz(1),sz(2)-co(i)+2:sz(2)-co(i)+1+sz(2));
    main(:,:,i)=main(:,:,i)+global_mask*1000;
    main(ro(i),co(i),i)=0;
    tmp_mask=zeros(sz);
    tmp_mask(B==B(ro(i),co(i)))=1;
    tmp_mask(ro(i),co(i))=0;
    single_mask(:,:,i)=tmp_mask;

    stack(1:end-1,:,1,i)=main(2:end,:,i);
    stack(2:end,:,2,i)=main(1:end-1,:,i);
    stack(:,1:end-1,3,i)=main(:,2:end,i);
    stack(:,2:end,4,i)=main(:,1:end-1,i);
end

% figure
% imagesc(main(:,:,1).*(~global_mask))
% colorbar
% title('Final Initial main 2 (zeroed)')


for i=1:N
%          D=1;
%          while D
    for D=1:min(B(ro(i),co(i)),max(sz(1),sz(2)))*2
        main_new=min(stack(:,:,:,i),[],3)+1;
        
        
        main_new=main_new+global_mask*1000;
        main_new(ro(i),co(i))=0;
% figure
% imagesc(main(:,:,1).*(~global_mask))
% colorbar
% title('Final Initial main i (zeroed)')
%         
% figure
% imagesc(main_new.*(~global_mask))
% colorbar
% title('Final Initial main_new i (zeroed)')
%  main_new-main(:,:,i)
%  pause
        if any(any(main_new-main(:,:,i)))
        main(:,:,i)=main_new;
        stack(1:end-1,:,1,i)=main(2:end,:,i);
        stack(2:end,:,2,i)=main(1:end-1,:,i);
        stack(:,1:end-1,3,i)=main(:,2:end,i);
        stack(:,2:end,4,i)=main(:,1:end-1,i);
        else
            break
        end
    end
main(:,:,i)=min(stack(:,:,:,i),[],3)+1;
main(ro(i),co(i),i)=0;    
end


% figure
% imagesc(main(:,:,1))
% colorbar
% title('Main after steps (zeroed)');

%metrix=main(:,:,1).*single_mask(:,:,1)+(~single_mask(:,:,1))*1000;


metrixN=ones(sz(1),sz(2),N);
for i=1:N
    metrixN(:,:,i)=(main(:,:,i)-B(ro(i),co(i))*2).*single_mask(:,:,i)+(~single_mask(:,:,i))*1000;
end


min_N=min(min(metrixN,[],1),[],2);

[best_N best_N_ind]=min(squeeze(min_N));
% best_N
% best_N_ind

if best_N>0
    W=ones([0 4]);
    return
end
metrix=main(:,:,best_N_ind).*single_mask(:,:,best_N_ind)+(~single_mask(:,:,best_N_ind))*1000;

% figure
% imagesc(single_mask(:,:,1))
% colorbar
% title('Single mask')


% figure
% imagesc(metrix)
% colorbar
% title('Metrix')

[c ind]=min(metrix(:));
if c==1000
    W=ones([0 4]);
    return
end

[rot cot]=ind2sub(sz,ind);
%  rot
%  cot
%  c
% 
this_one_main=main(:,:,best_N_ind)+global_mask*1000;
this_one_main(ro(best_N_ind),co(best_N_ind))=0;

% figure
% imagesc(this_one_main)
% colorbar
% title('this_one_main')

% figure
% imagesc(main(:,:,1))
% colorbar
% title('main(:,:,1)')

for st=1:c
%  rot
%  cot
    [m i]=min([this_one_main(max(1,rot-1),cot,1) this_one_main(min(sz(1),rot+1),cot,1) this_one_main(rot,max(1,cot-1),1) this_one_main(rot,min(sz(2),cot+1),1)]);

    switch i
        case 1
            W=[W; [rot, cot, rot-1, cot]];
            rot=rot-1;
        case 2
            W=[W; [rot, cot, rot+1, cot]];
            rot=rot+1;
        case 3
            W=[W; [rot, cot, rot, cot-1]];
            cot=cot-1;
        case 4
            W=[W; [rot, cot, rot, cot+1]];
            cot=cot+1;
    end

end