| 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
|