public virtual void NormalSyanten(SortedTilesEnumerator tiles, ref int result) { if (tiles.Count % 3 == 0) { throw new ArgumentException("牌数量不能是3的倍数。", nameof(tiles)); } var args = new SyantenArgs { Result = result, MinValue = 1 - tiles.Count % 3 }; NormalSyantenCutPair(tiles.Tiles, tiles.Count, args); result = args.Result; }
private static void NormalSyantenCutPair(int[] tiles, int count, SyantenArgs args) { if (args.Result == args.MinValue) { return; } for (int i = 0; i < 34; i++) { if (tiles[i] >= 2) { tiles[i] -= 2; NormalSyantenCut3(tiles, 0, count - 2, (count / 3) | 0x01000000, args); tiles[i] += 2; } } NormalSyantenCut3(tiles, 0, count, count / 3, args); }
private static void NormalSyantenCut3(int[] tiles, int i, int remCount, int argsTuple, SyantenArgs args) { if (args.Result == args.MinValue) { return; } while (i < 34 && tiles[i] == 0) { i++; } if (i == 34) { NormalSyantenCut2(tiles, 0, remCount, argsTuple, args); return; } ref int curr = ref tiles[i];