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
|