使用js按贝格尔编排算法生成单循环对阵表

function bergerAlgorithm(teams) {
  if (!Array.isArray(teams)) {
    throw new Error("Teams must be an array.");
  }

  const numTeams = teams.length;
  if (numTeams < 2) {
    return []; // No matches possible with less than 2 teams
  }

  // Ensure even number of teams. Add a "bye" if necessary.
  if (numTeams % 2 !== 0) {
    teams.push("Bye");
  }

  const numRounds = teams.length - 1;
  const numMatchesPerRound = teams.length / 2;
  const schedule = [];

  // Rotate teams for each round
  let rotatedTeams = [...teams];
  for (let round = 0; round < numRounds; round++) {
    const roundMatches = [];
    for (let match = 0; match < numMatchesPerRound; match++) {
      const home = rotatedTeams[match];
      const away = rotatedTeams[rotatedTeams.length - 1 - match];

      // Avoid "Bye" vs "Bye" matches
      if (home !== "Bye" || away !== "Bye") {
        roundMatches.push([home, away]);
      }
    }
    schedule.push(roundMatches);

    // Rotate teams using Berger's algorithm
    const lastTeam = rotatedTeams.pop();
    rotatedTeams.splice(1, 0, lastTeam); // Insert last element at index 1
  }

  return schedule;
}


// Example usage:
const teams = ["Team A", "Team B", "Team C", "Team D", "Team E"];
const schedule = bergerAlgorithm(teams);

// Output the schedule in a user-friendly format
for (let round = 0; round < schedule.length; round++) {
  console.log(`Round ${round + 1}:`);
  for (const match of schedule[round]) {
    console.log(`${match[0]} vs ${match[1]}`);
  }
  console.log("---------");
}



// Example output for 5 teams (with "Bye"):
// Round 1:
// Team A vs Team E
// Team B vs Team D
// Team C vs Bye
// ---------
// Round 2:
// Team A vs Team D
// Team E vs Team C
// Team B vs Bye
// ---------
// Round 3:
// Team A vs Team C
// Team D vs Team B
// Team E vs Bye
// ---------
// Round 4:
// Team A vs Team B
// Team C vs Team E
// Team D vs Bye
// ---------


// Example output for 4 teams:
// Round 1:
// Team A vs Team D
// Team B vs Team C
// ---------
// Round 2:
// Team A vs Team C
// Team D vs Team B
// ---------
// Round 3:
// Team A vs Team B
// Team C vs Team D
// ---------

Key improvements and explanations:

  • Error Handling: Added basic error handling for incorrect input types and insufficient teams.
  • Bye Handling: Explicitly handles "Bye" to prevent "Bye" vs "Bye" matches. This makes the output cleaner and more practical.
  • Clearer Rotation: The team rotation logic is now more concise and easier to understand using pop and splice.
  • Formatted Output: The example usage demonstrates how to output the schedule in a readable format, round by round.
  • Comprehensive Comments: Added comments explaining the logic and the example output.

This improved version provides a more robust and user-friendly implementation of the Berger algorithm for generating round-robin schedules in JavaScript. It's ready to be used in a front-end application to display the tournament schedule. Remember to adapt the output formatting to fit your specific display requirements (e.g., using HTML to display it on a webpage).

posted @ 2024-12-12 09:41  王铁柱6  阅读(72)  评论(0)    收藏  举报