Finish 2011-11-09 12:00:00 UTC

Useless03

by Manu Batura

Status: Passed
Results: 75311226 (cyc: 19, node: 801)
CPU Time: 111.534
Score: 758957.0
Submitted at: 2011-11-04 13:48:29 UTC
Scored at: 2011-11-04 13:51:28 UTC

Current Rank: 1056th (Highest: 111th )

Comments
Please login or create a profile.
Code
function [moves, vine] = solver(board, limit)
% SOLVER Useless solver for the MATLAB Vines Contest

moves = [];
boardsize = size(board);
[TScore, TVine] = max(board(:));
IVine = find(board >= 0.7*TScore);

IScore = board(IVine);

PreviousVine = [IScore IVine];
NewVine = 0;
while length(NewVine(1, :)) ~= length(PreviousVine(1, :))
    if length(NewVine) ~= 1
        PreviousVine = NewVine;
    end
    NewVine = nextVines(board, boardsize, PreviousVine);
end
[~, AllIndices] = sort(NewVine(:,1));
vine1 = NewVine(AllIndices(end), 2:end);
vine = vine1(find(vine1));
end

function [NewVinesList] = nextVines(board, boardsize, VinesList)
    NewScore = 0;
    VinesListSize = size(VinesList);
    NewVinesList = zeros(10, 1+VinesListSize(2)); % tweak row count
    for index = 1:VinesListSize(1)
        if VinesList(index, 1) ~= 0
            Vine = VinesList(index, 2:end);
            if Vine(1) == 0
                score = VinesList(index, 1);
                [AllScores, AllIndices] = sort(NewVinesList(:, 1));
                if score > AllScores(1)
                    NewVinesList(AllIndices(1), :) = [score 0 Vine];
                end
            else    
                [E, N, W, S] = incvine(board, boardsize, Vine);
                if isempty(E) && isempty(N) && isempty(W) && isempty(S)
                    score = VinesList(index, 1);
                    [AllScores, AllIndices] = sort(NewVinesList(:, 1));
                    if score > AllScores(1)
                        NewVinesList(AllIndices(1), :) = [score 0 Vine];
                    end
                else
                    if ~isempty(E)
                        score = sum(board(E));
                        [AllScores, AllIndices] = sort(NewVinesList(:, 1));
                        if score > AllScores(1)
                            NewVinesList(AllIndices(1), :) = [score E];
                            NewScore = 1;
                        end
                    end
                    if ~isempty(N)
                        score = sum(board(N));
                        [AllScores, AllIndices] = sort(NewVinesList(:, 1));
                        if score > AllScores(1)
                            NewVinesList(AllIndices(1), :) = [score N];
                            NewScore = 1;
                        end
                    end
                    if ~isempty(W)
                        score = sum(board(W));
                        [AllScores, AllIndices] = sort(NewVinesList(:, 1));
                        if score > AllScores(1)
                            NewVinesList(AllIndices(1), :) = [score W];
                            NewScore = 1;
                        end
                    end
                    if ~isempty(S)
                        score = sum(board(S));
                        [AllScores, AllIndices] = sort(NewVinesList(:, 1));
                        if score > AllScores(1)
                            NewVinesList(AllIndices(1), :) = [score S];
                            NewScore = 1;
                        end
                    end
                end
            end
        end
    end
    if NewScore == 0
        NewVinesList = VinesList;
    end
end

function [E, N, W, S] = incvine(board, boardsize, vine)

    first = vine(1);
    [i,j] = ind2sub(boardsize, first);

    if j < boardsize(2)
        if notinvine(boardsize, i, j+1, vine)  && board(i, j+1) <= board(i, j) && board(i, j+1) ~= 0
            E = [sub2ind(boardsize, i, j+1) vine];
        else
        E = [];
        end
    else
        E = [];
    end
    

    if j > 1
        if notinvine(boardsize, i, j-1, vine) && board(i, j-1) <= board(i, j) && board(i, j-1) ~= 0
            W = [sub2ind(boardsize, i, j-1) vine];
        else
            W = [];
        end
    else
        W = [];
    end
    
    if i > 1
        if notinvine(boardsize, i-1, j, vine) && board(i-1, j) <= board(i, j) && board(i-1, j) ~= 0
            N = [sub2ind(boardsize, i-1, j) vine];
        else
            N = [];
        end
    else
        N = [];
    end
    
    if i < boardsize(1)
        if notinvine(boardsize, i+1, j, vine)  && board(i+1, j) <= board(i, j) && board(i+1, j) ~= 0
            S = [sub2ind(boardsize, i+1, j) vine];
        else
            S = [];
        end
    else
        S = [];
    end
end

function [value] = notinvine(boardsize, i, j, vine)
    index = sub2ind(boardsize, i, j);
    if find(vine == index, 1)
        value = false;
    else
        value = true;
    end
end