算法训练VIP 比赛安排
原题链接:比赛安排
题目描述
设有有2n(n<=6)个球队进行单循环比赛,计划在2n–1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2n–1天内每个队都与不同的对手比赛。
输入
共一行,输入n的数值。
输出
共(2 n – 1)行,第i行输出第i天的比赛安排。
格式为: A-B C-D 其中i是天数,A,B分别为比赛双方的编号,每行共2n-1个比赛场次。
样例输入
2
样例输出
<1> 1-2 3-4
<2> 1-3 2-4
<3> 1-4 2-3
思考:
提交老是正确80%
但是对比他的答案确实是没错,可能是输出顺序有误
若有大佬在本文基础上答解正确,可否请在评论讲讲😂
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int n;
int team[13][13];//标记每个队伍已经匹配过的队伍
int daynum[13];//标记每天已经安排了比赛的队伍
int record[7][2];
bool isWork(int begin,int index)
{
if (begin == 2 * n)
return true;
if (daynum[begin] != 1)
{
for (int i = begin + 1; i <= 2 * n; i++)
{
if (daynum[i] == 1)continue;
if (team[begin][i] != 1)
{
team[begin][i] = team[i][begin] = 1;
daynum[begin] = daynum[i] = 1;
if (isWork(begin + 1,index+1))
{
record[index][0] = begin;
record[index][1] = i;
return true;
}
else
{
team[begin][i] = team[i][begin] = 0;
daynum[begin] = daynum[i] = 0;
}
}
}
}
else
{
return isWork(begin + 1,index);
}
return false;
}
int main()
{
cin >> n;
for (int i = 1; i <= 2 * n - 1; i++)
{
cout << "<" << i << ">" << " ";
isWork(1, 1);
for (int x = 2; x <= n; x++)
{
for (int j = x + 1; j <= n; j++)
{
if (record[x][0] > record[j][0])
{
int temp1 = record[x][1];
record[x][1] = record[j][1];
record[j][1] = temp1;
int temp2 = record[x][0];
record[x][0] = record[j][0];
record[j][0] = temp2;
}
}
}
for (int index = 1; index <= n; index++)
{
cout << record[index][0] << "-" << record[index][1] << " ";
}
for (int x = 1; x <= 2 * n; x++)
{
daynum[x] = 0;
}
cout << endl;
}
cout << endl;
return 0;
}