function sol = seesolver(solnum,puzzle,tit)
% sol = seesolver(solnum,puzzle,tit)
% Copyright 2006 The MathWorks, Inc.
if nargin<1
solnum = @solver;
end
if nargin<2
% ned's example
puzzle = [0 0 0 0 7;0 0 0 0 0;0 15 0 0 0;0 0 0 0 0;0 2 0 0 0];
end
if nargin<3
tit = sprintf('Solver: %s',evalc('disp(solnum)'));
tit(tit == 10)=[];
end
[x0,y0,z0] = ellipsoid(0,0,0,.40,.40,.40,50);
[x1,y1,z1] = ellipsoid(0,0,0,.50,.50,.50,50);
[x2,y2,z2] = ellipsoid(0,0,0,.60,.60,.60,50);
[xt,yt,zt] = ellipsoid(0,0,0,.2,.2,2,30);
x3 = [xt+.3;xt-.3;xt-.3;xt+.3];
y3 = [yt+.3;yt-.3;yt+.3;yt-.3];
z3 = [zt;zt;zt;zt];
x4 = [xt+.6;xt-.6;xt-.6;xt+.6];
y4 = [yt+.6;yt-.6;yt+.6;yt-.6];
z4 = [zt;zt;zt;zt];
clear beam
beam(-puzzle); % negative to indicate to beam to save info
sol = solnum(size(puzzle,1));
[nb dc] = beam([]);
figure(gcf);clf;
pause(2)
[ha hs]= drawpuzzle(puzzle,tit);
pause(5)
hb = uicontrol('Style','text','Position',[3 3 80 20],...
'HorizontalAlignment','left','BackgroundColor',[1 1 .7],...
'fontsize',10,'String','Beams: 0');
bctr=0;
n = size(puzzle,1);
if n<15
fsize = 12;
msize = 7;
k = .1;
mypause1 = 0.1;
mypause2 = 0.1;
mypause3 = 0.1;
elseif n<20
fsize = 11;
msize = 7;
k =.12;
mypause1 = .0001;
mypause2 = 0.1;
mypause3 = 0.1;
elseif n<25
fsize = 10;
msize = 6;
k = .16;
mypause1 = 0;
mypause2 = 0.0001;
mypause3 = 0.1;
elseif n<30
fsize = 9;
msize = 6;
k = .16;
mypause1 = 0;
mypause2 = 0;
mypause3 = 0.1;
else
fsize = 8;
msize = 5;
k = .18;
mypause1 = 0;
mypause2 = 0;
mypause3 = 0.0001;
end
H = cell(n+2);
for i = 1:size(dc,1)
if dc{i,6}
col = 'r';
else
col = 'b';
end
Hind = sub2ind([n+2,n+2],dc{i,3},dc{i,4});
harr = [];
hlin = [];
htxt = [];
if numel(dc{i,4})==1
if dc{i,3}-1>n
dc{i,3} = dc{i,3} - [0 .5 0];
dc{i,4} = dc{i,4} + [0 0 0];
elseif dc{i,3} == 1
dc{i,3} = dc{i,3} + [0 .5 0];
dc{i,4} = dc{i,4} + [0 0 0];
elseif dc{i,4}-1>n
dc{i,3} = dc{i,3} + [0 0 0];
dc{i,4} = dc{i,4} - [0 .5 0];
elseif dc{i,4} == 1
dc{i,3} = dc{i,3} + [0 0 0];
dc{i,4} = dc{i,4} + [0 .5 0];
end
end
if isequal(dc(i,[1 2]),dc(i,[9 10]))
q = numel(dc{i,3})+1;
dc{i,3} = dc{i,3}([1:q/2 q/2:end]);
dc{i,4} = dc{i,4}([1:q/2 q/2:end]);
if dc{i,3}(2)>dc{i,3}(1)
dir = 'up';
elseif dc{i,3}(2)<dc{i,3}(1)
dir = 'down';
elseif dc{i,4}(2)>dc{i,4}(1)
dir = 'right';
elseif dc{i,4}(2)<dc{i,4}(1)
dir = 'left';
end
for j = 1:(q/2-1)
if dc{i,3}(j+1)>dc{i,3}(j)
ndir = 'up';
elseif dc{i,3}(j+1)<dc{i,3}(j)
ndir = 'down';
elseif dc{i,4}(j+1)>dc{i,4}(j)
ndir = 'right';
elseif dc{i,4}(j+1)<dc{i,4}(j)
ndir = 'left';
end
switch [dir ndir]
case 'upup'
dc{i,4}(j) = dc{i,4}(j) + k;
case 'upleft'
dc{i,4}(j) = dc{i,4}(j) + k;
dc{i,3}(j) = dc{i,3}(j) + k;
case 'upright'
dc{i,4}(j) = dc{i,4}(j) + k;
dc{i,3}(j) = dc{i,3}(j) - k;
case 'downdown'
dc{i,4}(j) = dc{i,4}(j) - k;
case 'downleft'
dc{i,4}(j) = dc{i,4}(j) - k;
dc{i,3}(j) = dc{i,3}(j) + k;
case 'downright'
dc{i,4}(j) = dc{i,4}(j) - k;
dc{i,3}(j) = dc{i,3}(j) - k;
case 'leftleft'
dc{i,3}(j) = dc{i,3}(j)+k;
case 'leftup'
dc{i,3}(j) = dc{i,3}(j)+k;
dc{i,4}(j) = dc{i,4}(j)+k;
case 'leftdown'
dc{i,3}(j) = dc{i,3}(j)+k;
dc{i,4}(j) = dc{i,4}(j)-k;
case 'rightright'
dc{i,3}(j) = dc{i,3}(j)-k;
case 'rightup'
dc{i,3}(j) = dc{i,3}(j)-k;
dc{i,4}(j) = dc{i,4}(j)+k;
case 'rightdown'
dc{i,3}(j) = dc{i,3}(j)-k;
dc{i,4}(j) = dc{i,4}(j)-k;
end
dir = ndir;
end
switch dir
case 'up'
dc{i,4}(q/2) = dc{i,4}(q/2)+k;
dc{i,4}(q/2+1) = dc{i,4}(q/2+1)-k;
dir = 'down';
case 'down'
dc{i,4}(q/2) = dc{i,4}(q/2)-k;
dc{i,4}(q/2+1) = dc{i,4}(q/2+1)+k;
dir = 'up';
case 'left'
dc{i,3}(q/2) = dc{i,3}(q/2)+k;
dc{i,3}(q/2+1) = dc{i,3}(q/2+1)-k;
dir = 'right';
case 'right'
dc{i,3}(q/2) = dc{i,3}(q/2)-k;
dc{i,3}(q/2+1) = dc{i,3}(q/2+1)+k;
dir = 'left';
end
for j = (q/2+2):(q-1)
if dc{i,3}(j+1)>dc{i,3}(j)
ndir = 'up';
elseif dc{i,3}(j+1)<dc{i,3}(j)
ndir = 'down';
elseif dc{i,4}(j+1)>dc{i,4}(j)
ndir = 'right';
elseif dc{i,4}(j+1)<dc{i,4}(j)
ndir = 'left';
end
switch [dir ndir]
case 'upup'
dc{i,4}(j) = dc{i,4}(j) + k;
case 'upleft'
dc{i,4}(j) = dc{i,4}(j) + k;
dc{i,3}(j) = dc{i,3}(j) + k;
case 'upright'
dc{i,4}(j) = dc{i,4}(j) + k;
dc{i,3}(j) = dc{i,3}(j) - k;
case 'downdown'
dc{i,4}(j) = dc{i,4}(j) - k;
case 'downleft'
dc{i,4}(j) = dc{i,4}(j) - k;
dc{i,3}(j) = dc{i,3}(j) + k;
case 'downright'
dc{i,4}(j) = dc{i,4}(j) - k;
dc{i,3}(j) = dc{i,3}(j) - k;
case 'leftleft'
dc{i,3}(j) = dc{i,3}(j)+k;
case 'leftup'
dc{i,3}(j) = dc{i,3}(j)+k;
dc{i,4}(j) = dc{i,4}(j)+k;
case 'leftdown'
dc{i,3}(j) = dc{i,3}(j)+k;
dc{i,4}(j) = dc{i,4}(j)-k;
case 'rightright'
dc{i,3}(j) = dc{i,3}(j)-k;
case 'rightup'
dc{i,3}(j) = dc{i,3}(j)-k;
dc{i,4}(j) = dc{i,4}(j)+k;
case 'rightdown'
dc{i,3}(j) = dc{i,3}(j)-k;
dc{i,4}(j) = dc{i,4}(j)-k;
end
dir = ndir;
end
switch dir
case 'up'
dc{i,4}(end) = dc{i,4}(end)+k;
case 'down'
dc{i,4}(end) = dc{i,4}(end)-k;
case 'left'
dc{i,3}(end) = dc{i,3}(end)+k;
case 'right'
dc{i,3}(end) = dc{i,3}(end)-k;
end
end
if numel(dc{i,4})>1
hlin = plot(0,0,col,'linewidth',2);
for j = 2 : numel(dc{i,4})
set(hlin,'Xdata',dc{i,4}(1:j)-1,'Ydata',dc{i,3}(1:j)-1)
mypause(mypause1)
end
end
if round(dc{i,3}(end))-1>n
harr = plot(dc{i,4}(end)-1,dc{i,3}(end)-1,'v','color',col);
set(harr,'MarkerFaceColor',col,'MarkerSize',msize)
htxt = text(round(dc{i,4}(end))-1,round(dc{i,3}(end))-.8,num2str(dc{i,5}));
set(htxt,'horizontal','center','vertical','top','fontsize',fsize)
elseif round(dc{i,4}(end))-1>n
harr = plot(dc{i,4}(end)-1,dc{i,3}(end)-1,'>','color',col);
set(harr,'MarkerFaceColor',col,'MarkerSize',msize)
htxt = text(round(dc{i,4}(end))-.5,round(dc{i,3}(end))-1,num2str(dc{i,5}));
set(htxt,'horizontal','left','vertical','middle','fontsize',fsize)
elseif round(dc{i,3}(end))-1 == 0
harr = plot(dc{i,4}(end)-1,dc{i,3}(end)-1,'^','color',col);
set(harr,'MarkerFaceColor',col,'MarkerSize',msize)
htxt = text(round(dc{i,4}(end))-1,round(dc{i,3}(end))-1.2,num2str(dc{i,5}));
set(htxt,'horizontal','center','vertical','bottom','fontsize',fsize)
elseif round(dc{i,4}(end))-1 == 0
harr = plot(dc{i,4}(end)-1,dc{i,3}(end)-1,'<','color',col);
set(harr,'MarkerFaceColor',col,'MarkerSize',msize)
htxt = text(round(dc{i,4}(end))-1.5,round(dc{i,3}(end))-1,num2str(dc{i,5}));
set(htxt,'horizontal','right','vertical','middle','fontsize',fsize)
elseif dc{i,6} == 0 %absorbed
c = dc{i,4}(end)-1;
r = dc{i,3}(end)-1;
set(hs(r,c),'XData',x1+c,'yData',y1+r,'zData',z1+puzzle(r,c))
mypause(mypause2)
set(hs(r,c),'XData',x2+c,'yData',y2+r,'zData',z2+puzzle(r,c))
mypause(mypause3)
set(hs(r,c),'XData',x1+c,'yData',y1+r,'zData',z1+puzzle(r,c))
mypause(mypause2)
set(hs(r,c),'XData',x0+c,'yData',y0+r,'zData',z0+puzzle(r,c))
mypause(mypause3)
elseif dc{i,6} == 1 %destroyed
c = dc{i,4}(end)-1;
r = dc{i,3}(end)-1;
set(hs(r,c),'XData',x1+c,'yData',y1+r,'zData',z1+puzzle(r,c))
mypause(mypause2)
set(hs(r,c),'XData',x2+c,'yData',y2+r,'zData',z2+puzzle(r,c))
mypause(mypause2)
set(hs(r,c),'XData',x3+c,'yData',y3+r,'zData',z3+puzzle(r,c))
mypause(mypause3)
set(hs(r,c),'XData',x4+c,'yData',y4+r,'zData',z4+puzzle(r,c))
mypause(mypause2)
set(hs(r,c),'XData',x0+100,'yData',y0+100,'zData',z0+puzzle(r,c))
mypause(mypause3)
end
if ~isempty(harr)
H(Hind) = cellfun(@(x) [x harr htxt], H(Hind),'uniform',false);
end
if ~isempty(hlin)
H(Hind) = cellfun(@(x) [x hlin], H(Hind),'uniform',false);
end
if dc{i,6} == 1
if round(dc{i,4}(end))==n+2 || round(dc{i,4}(end))==1 || round(dc{i,3}(end))==n+2 || round(dc{i,3}(end))==1
c = round(dc{i,4}(end));
r = round(dc{i,3}(end));
Htemp = H(r,c);
todel = setdiff(unique(cell2mat(Htemp(:)')),[harr hlin htxt]);
else
c = max(1,round(dc{i,4}(end))-1):min(n+2,round(dc{i,4}(end))+1);
r = max(1,round(dc{i,3}(end))-1):min(n+2,round(dc{i,3}(end))+1);
Htemp = H(r,c);
todel = unique(cell2mat(Htemp(:)'));
harr = [];
hlin = [];
Htemp = H(r,c);
todel = unique(cell2mat(Htemp(:)'));
end
H = cellfun(@(x) setdiff(x,todel),H,'Uniform',false);
delete(todel)
end
if dc{i,6}==1
if round(dc{i,3}(end))>1 && round(dc{i,3}(end))<n+2 && round(dc{i,4}(end))>1 && round(dc{i,4}(end))<n+2
bctr = bctr+puzzle(round(dc{i,3}(end))-1,round(dc{i,4}(end))-1);
end
else
bctr = bctr+1;
end
set(hb,'string',sprintf('Beams: %d',bctr))
mypause(.00001)
if dc{i,6}==1
set(harr,'MarkerFaceColor',[1 .8 .8])
set(harr,'Color',[1 .8 .8])
set(hlin,'Color',[1 .8 .8])
else
set(harr,'MarkerFaceColor',[.8 .8 1])
set(harr,'Color',[.8 .8 1])
set(hlin,'Color',[.8 .8 1])
end
end
if nargout == 0
clear sol
end
function mypause(p)
if p
drawnow
pause(p)
end