36.比赛获胜顺序

来源:互联网 发布:走出帝制在淘宝怎么搜 编辑:程序博客网 时间:2024/05/21 09:48

 谷歌笔试:
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[n],求出
result。

思路:定义一个vector或list容器来将比比赛顺序放入容器中,通过容器的迭代器来轮循比较各队的实力,

弱的队写入result数组中,并将它从容器中删除。

代码如下:

 

#include<iostream>#include<list>using namespace std;void Result(int ** w,int *order,int *result,int n){list<int> lis;for(int i=0;i<n;i++){lis.push_back(order[i]);}int first,second;int round=1;int rescount=n-1;while(lis.size()>1){cout<<"Round"<<round++<<":"<<endl;list<int>::iterator it=lis.begin();while(it!=lis.end()){first=*it;it++;if(it==lis.end()){ cout<<"Num "<<first<<" rest int this Round "<<endl;}else{second=*it;int win=*((int*)w+n*first+second);if(win==first){result[rescount]=second;rescount--;it=lis.erase(it);cout<<"Num "<<first<<" kick out Num "<<second<<endl;}if(win==second){result[rescount]=first;rescount--;--it;it=lis.erase(it);++it;cout<<"Num "<<second<<" kick out Num "<<first<<endl;}}}}if(lis.size()==1){result[0]=lis.back();}cout<<"the final result is :"<<endl;for(int i=0;i<n;i++)cout<<result[i]<<" ";}int main(){int w[5][5]={0,1,0,3,4, 1,1,2,1,1, 0,2,2,3,4, 3,1,3,3,3, 4,1,4,3,4};int result[5]={-1};int order[5]={2,4,1,0,3};Result((int**)w,order,result,5);}


原创粉丝点击