I’m having trouble finding an algorithm for my problem.
I have a grid of 8×8 blocks, each block has a value ranging from 0 to 9. And I want to find collections of connected blocks that match a total value of for example 15. My first approach was to start of at the border, that worked fine. But when starting in the middle of the grid my algorithm gets lost.
Would anyone know a simple algorithm to use or can you point me in the right direction?
Thanks!
As far as I know, no simple algorithm exists for this. As for pointing you in the right direction, an 8×8 grid is really just a special case of a graph, so I’d start with graph traversal algorithms. I find that in cases like this, it sometimes helps to think how you would solve the problem for a smaller grid (say, 3×3 or 4×4) and then see if your algorithm scales up to “full size.”
EDIT :
My proposed algorithm is a modified depth-first traversal. To use it, you’ll have to convert your grid into a graph. The graph should be undirected, since connected blocks are connected equally in both directions.
Each graph node represents a single block, containing the block’s value and a
visitedvariable. Edge weights represent their edges’ resistance to being followed. Set them by summing the values of the nodes they connect. Depending on the sum you’re looking for, you may be able to optimize this by removing edges that are guaranteed to fail. For example, if you’re looking for 15, you can delete all edges with weight of 16 or greater.The rest of the algorithm will be performed as many times as there are blocks, with each block serving as the starting block once. Traverse the graph by following the lowest-weighted edge from the current node, unless that takes you to a visited node. Push each visited node onto a stack and set its
visitedvariable totrue. Keep a running sum for every path followed.visitedto false and popping the current node off the stack.After every possible path from a given starting node is analyzed, every answer that includes that node has been found. So, remove all edges touching the starting node and choose a new starting node.
I haven’t fully analyzed the efficiency/running time of this algorithm yet, but… it’s not good. (Consider the number of paths to be searched in a graph containing all zeroes.) That said, it’s far better than pure brute force.