Ваш алгоритм в порядке, если вы встроили его в алгоритм обратного отслеживания (http://en.wikipedia.org/wiki/Backtracking).. Самый простой способ сделать это - вызвать ваш метод рекурсивно, как только вы нашли подходящую пару / чау / ..., но сбросить текущий Если это не так. В псевдокоде это выглядит примерно так:
1. Mark all tiles as nonwinning
2. Call function Backtracking
Function Backtracking:
1. If all tiles are marked winning return WINNING else NONWINNING
2. Visit tiles as described in your algorithm
3. When found a chow/pong/... or the first pair
3.1. Mark those tiles as winning.
3.2. Afterwards call method Backtracking.
3.3. If return value of 3.2 is WINNING also return WINNING
3.4. Else unmark the tiles as nonwinning again
4. If not finished search for pair/chow/... by looping to 3.
5. All combinations are done and no winning movewas found so return NONWINNING
Идея состоит в том, что вы сначала пробуете каждую пару / ... как часть выигрышной руки, но если это не сработает, просто попробуйте то же самое, предполагая, что это не часть выигрышной руки.
Если вас интересует не только выигрышная комбинация, но и все возможные комбинации выигрышных пар / чау-чау / ... пропустите возврат на шаге 3.3.