Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 2

Để giải bài toán này bằng phương pháp chia để trị, chúng ta có thể sử dụng phương

pháp đệ quy. Ý tưởng chính là chia bài toán lớn thành các bài toán nhỏ hơn, giảm bài
toán ban đầu thành các bài toán con nhỏ hơn và giải quyết chúng, sau đó kết hợp kết
quả để đạt được giải pháp cho bài toán lớn.

Ở đây, ta có thể tiếp cận bài toán theo cách sau:

1. Chia vòng tròn thành hai nửa: một nửa chứa các đối thủ có số thứ tự từ 1 đến n/2, và
một nửa chứa các đối thủ có số thứ tự từ n/2 + 1 đến n.
2. Xác định lịch thi đấu cho mỗi nửa của vòng tròn bằng cách gọi đệ quy.
3. Kết hợp các lịch thi đấu từ hai nửa để tạo thành lịch thi đấu hoàn chỉnh.

Dưới đây là một cách triển khai giải thuật sử dụng Python:

def round_robin_schedule(n):

if n % 2 == 1:

n += 1 # Nếu số lượng người chơi là lẻ, thêm một người giả để tạo thành số chẵn

# Tạo danh sách các người chơi

players = list(range(1, n + 1))

# Tạo danh sách để lưu trữ lịch thi đấu

schedule = []

# Lặp qua từng ngày thi đấu

for _ in range(n - 1):

# Tạo danh sách các trận đấu trong mỗi ngày

matches = []

# Lặp qua từng cặp đối thủ

for i in range(n // 2):

matches.append((players[i], players[-i - 1])) # Đối thủ đầu tiên sẽ đấu với đối thủ cuối cùng, v.v.
# Di chuyển người chơi ở vị trí cuối cùng đến vị trí thứ hai và dịch chuyển tất cả các người chơi khác

players = [players[0]] + [players[-1]] + players[1:-1]

# Thêm danh sách các trận đấu vào lịch thi đấu

schedule.append(matches)

return schedule

# In lịch thi đấu

def print_schedule(schedule):

for i, matches in enumerate(schedule, start=1):

print(f"Ngày {i}:")

for match in matches:

print(f"Trận {match[0]} vs {match[1]}")

# Sử dụng hàm để tạo lịch thi đấu cho 6 đối thủ

n=6

schedule = round_robin_schedule(n)

print_schedule(schedule)

Kết quả của mã trên sẽ là một lịch thi đấu vòng tròn mà mỗi người chơi đấu
với mỗi người chơi khác một lần, và số ngày thi đấu sẽ là ít nhất có thể.

You might also like