function [moves,vine]=solver(board, limit)
%function [moves,vine]=solver()
% greedy - no moves
[m,n] = size(board);
max_board = max(max(board));
eb = zeros(m+2,n+2);
eb(2:m+1,2:n+1) = board;
eb(1,:) = max_board+1;
eb(m+2,:) = max_board+1;
eb(:,1) = max_board+1;
eb(:,n+2) = max_board+1;
vb = zeros(m+2,n+2);
vb(1,:) = 1;
vb(m+2,:) = 1;
vb(:,1) = 1;
vb(:,n+2) = 1;
vb(find(eb(:)==0)) = 1;
max_cost = 0;
max_vine = [];
valid_nodes = find(eb(:)~=0 & vb(:)==0);
for i=1:length(valid_nodes)
%display(i);
current_node = valid_nodes(i);
[cost,vine] = stage(current_node,vb,eb,0);
if cost>max_cost
max_cost = cost;
max_vine = vine;
end
end
max_vine = max_vine - (m+2);
max_vine = max_vine - 2*floor(max_vine/(m+2));
vine = max_vine - 1;
moves = [];
end
function [cost,vine] = stage(current_node,vb,eb,c)
[m n] = size(vb);
c = c + 1;
neighbor_nodes = [current_node-m,current_node-1,current_node+1,current_node+m];
neighbor_nodes = neighbor_nodes(find(vb(neighbor_nodes)==0));
val = eb(current_node);
neighbor_nodes = neighbor_nodes(find(eb(neighbor_nodes)<=val));
[ignore idx] = max(eb(neighbor_nodes));
neighbor_nodes = neighbor_nodes(idx);
vb(current_node) = 1;
max_cost = 0;
max_vine = [];
len = length(neighbor_nodes);
if c>495
len = 0;
end
for i=1:len
[future_cost future_vine] = stage(neighbor_nodes(i),vb,eb,c);
if future_cost>max_cost
max_cost = future_cost;
max_vine = future_vine;
end
end
vine = [current_node,max_vine];
cost = eb(current_node) + max_cost;
end
|