Code covered by the BSD License  

Highlights from
MATLAB Contest - blackbox

from MATLAB Contest - blackbox by The MATLAB Contest Team
All the files needed to develop and score an entry for this MATLABĀ® Programming Contest.

seesolver(solnum,puzzle,tit)
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
   

Contact us at files@mathworks.com