n支队伍比赛,分别编号为0,1,2,。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n],w[i][j]的值代表编号为i,j的队伍中更强的一支。
所以w[i][j]=i或者j, 现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n]={4,3,5,8,1。。。},那么第一轮比赛就是4对3,5对8.。。
胜者晋级,败者淘汰。同一轮淘汰的所有队伍排名不再细分,即可以随便排,下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名。
编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result,求出result。
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
stack<int> Result(int w[][100], int n, vector<int> order)
{
stack<int> result;//用此栈存储名次
vector<int>::size_type i=0;
while(result.size()<n)
{
vector<int>::iterator iter=order.begin();
if(order.size()==1)//如果只剩下一个,那么这个就是第一名了,进栈,全部比赛结束
{
result.push(*iter);
break;
}
i=0;
vector<int> ordertemp;
while(i < order.size())
{
if(i!=order.size()-1)//此情况相当于本轮比赛的队伍数为偶数的情况
{
if(w[*iter][*(iter+1)]==*iter)
{
ordertemp.push_back(*iter);//赢的进下一轮比赛
result.push(*(iter+1));//输的进栈
}
else
{
ordertemp.push_back(*(iter+1));
result.push(*iter);
}
i+=2;
iter+=2;
}
else//此情况相当于本轮比赛的队伍数为奇数的情况,最后一支队伍,没有别的队和它比,直接进下一轮比赛
{
ordertemp.push_back(*iter);
break;
}
}
order=ordertemp;//更新队伍
}
return result;
}
void main()
{
int n;
cout<<"请输入参赛对数:";
cin>>n;
int w[100][100];
cout<<"请输入实力对比关系:"<<endl;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>w[i][j];
int ord;
vector<int> order;
cout<<"请输入出场顺序:";
for(i=1; i<=n; i++)
{
cin>>ord;
order.push_back(ord);
}
stack<int> result=Result(w, n, order);
cout<<"比赛名次(从前到后):";
while(!result.empty())
{
cout<<result.top()<<" ";
result.pop();
}
}
测试用例:temp2 > temp1 > temp3 > temp0 > temp4 > temp5