public bool IsWon() { if (_lastMoveResult == MoveResult.Illegal) { return(false); } var winSize = _movesPlayed % 2 == 1 ? _a : _b; var edge = LookupEdge(_n, _lastMoveEdge); var n1 = GetNeighborsOfColor(edge.Item1, _lastMoveColor); var n2 = GetNeighborsOfColor(edge.Item2, _lastMoveColor); var common = ListUtility <int> .Intersection(n1, n2); return(IsCliqueOfSize(common, winSize - 2, _lastMoveColor)); }
bool IsCliqueOfSize(List <int> vertices, int size, int color) { if (vertices.Count < size) { return(false); } if (size <= 1) { return(true); } for (int i = 0; i < vertices.Count; i++) { var neighbors = ListUtility <int> .Intersection(vertices.Skip(i + 1), GetNeighborsOfColor(vertices[i], color)); if (IsCliqueOfSize(neighbors, size - 1, color)) { return(true); } } return(false); }