Finding strings in a matrix
Avoid magic numbers.

It is not immediately clear what 2 and 3 in find_next_match stand for (same for 3 and 4 in main). Even though the matrix is hardcoded, I recommend to infer its dimensions, rather then hardcode them also.
Avoid globals.

Passing std::string&amp; line as an additional parameter to find_next_match is cleaner then reliance on the global, and obviates the (pretty strange)

    chars.clear();
    chars = line;

tuple vs custom class.

Using a tuple makes the code too verbose to my taste. I'd invest into a struct position with an operator+ overloaded to perform what

    make_tuple(get&lt;0&gt;(cur_pos) + get&lt;0&gt;(dir), get&lt;1&gt;(cur_pos) + get&lt;1&gt;(dir));


does.
Nitpicks.


You should test if infile is opened correctly.
Final print may use a ternary

    std::cout &lt;&lt; (found? "True": "False") &lt;&lt; '\n';

I don't want to start a holy war, but I'd return 0; from main.
Kudos for not using namespace std;