public IList<MatchOpponents> GenerateMatches() { if (this.size <= 1) { return null; } else if (this.size == 2) { var firstMatch = new MatchOpponents(0, 1, this.round); this.matches.Add(firstMatch); var secondMatch = new MatchOpponents(1, 0, this.round); this.matches.Add(secondMatch); return this.matches; } int row = 0; if (this.hasEvenPlayers == true) { row = 1; } while (row < this.size) { this.tempMatches = new bool[this.size, this.size]; this.tempOpponets = new Stack<MatchOpponents>(); this.occupiedRowsAndCols = new bool[this.size]; this.hasPlayerAgainstAverage = false; this.hasAddedFixtureMatches = false; var match = new MatchOpponents(row, 0, this.round); this.tempOpponets.Push(match); this.occupiedRowsAndCols[row] = true; this.occupiedRowsAndCols[0] = true; this.board[row, 0] = true; if (this.hasEvenPlayers == false && row == 0) { this.hasPlayerAgainstAverage = true; } this.FindPossible(0); row++; } return this.matches; }
private void FindPossible(int row) { if (this.hasAddedFixtureMatches || this.hasFoundAllCombinations) { return; } if (row == this.size) { this.CheckAllComminations(); return; } int maxCol = row; if (this.hasEvenPlayers == true) { maxCol -= 1; } int col = 0; while (col <= maxCol) { if (this.tempMatches[row, col] == false && this.IsMatchAvailable(row, col)) { if (row == col) { this.hasPlayerAgainstAverage = true; } var match = new MatchOpponents(row, col, this.round); this.tempOpponets.Push(match); this.occupiedRowsAndCols[row] = true; this.occupiedRowsAndCols[col] = true; this.tempMatches[row, col] = true; if (this.tempOpponets.Count == this.tempOpponentsMaxCount) { this.AddTempOpponetsToFinalList(); this.hasAddedFixtureMatches = true; } this.FindPossible(row + 1); if (this.hasAddedFixtureMatches || this.hasFoundAllCombinations) { return; } if (row == col) { this.hasPlayerAgainstAverage = false; } this.tempOpponets.Pop(); this.occupiedRowsAndCols[row] = false; this.occupiedRowsAndCols[col] = false; this.tempMatches[row, col] = false; } col++; } this.FindPossible(row + 1); }