google面试题,loser team
#include <iostream>
/*
1.
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
*/
using namespace std;
void sort_team(
int * result, /*结果*/
int * order, /*比赛顺序*/
int** w1 , /*队伍实力对比*/
int begin, /*开始下标*/
int end, /*结束下标*/
int TEAM_NUM /*队伍数目*/
)
{
int (*w)[TEAM_NUM] =(int (*)[TEAM_NUM] ) w1;
int len=end-begin+1;
if(len<2)return;
int *p_tmp=new int[len]; //比赛顺序的临时copy
//将比较顺序复制到临时存储
for(int i=0;i<len;i++){
p_tmp[i]=order[begin+i];
}
int i=0, idx=0;
for(;i<len-1;i+=2 , ++idx){
if(w[ p_tmp[i] ][ p_tmp[i+1] ]==p_tmp[i]){ //第一队赢
result[begin+idx]=p_tmp[i];
//败的一队排到最后,因为“同一轮淘汰的所有队伍排名不再细分,即可以随便排”
result[end-idx]=p_tmp[i+1];
}
else{ //第二队赢
result[begin+idx]=p_tmp[i+1];
result[end-idx]=p_tmp[i];
}
}
//最后一队落单,让赢的队再与其比赛一次
if(i==len-1){
if(w[ result[begin+idx-1] ][ p_tmp[i] ] == p_tmp[i] ){
result[begin+idx]=result[begin+idx-1];
result[begin+idx-1]=p_tmp[i];
}
else{
result[begin+idx]=p_tmp[i];
}
}
delete [] p_tmp;
if( idx > begin+1 ) sort_team(result, result, w1 , begin, idx - 1 ,TEAM_NUM ); //递归,在胜利的队伍分区继续比赛
}
int main()
{
//team 2>team 1>team 3>team 0>team 4>team 5
int w[6][6] = {
{0,1,2,3,0,0}, /*0队*/
{1,1,2,1,1,1}, /*1队*/
{2,2,2,2,2,2}, /*2队*/
{3,1,2,3,3,3}, /*3队*/
{0,1,2,3,4,4}, /*4队*/
{0,1,2,3,4,5} /*5队*/
};
int order[6] = {1,3,4,2,0,5};
int result[6]={0,};
int len=sizeof(order)/sizeof(*order);
sort_team(result, order , (int **) w, 0 , len -1 , len );
for(int i=0;i<len;i++){
cout<<result[i]<<",";
}
cout<<endl;
return 0;
}
int (*)[NUM] 与 int *[NUM] 区别:
数组指针,指针数组
前一个的本质是指针,后一个的本质是数组。
int (*w)[TEAM_NUM] =(int (*)[TEAM_NUM] ) w1;

浙公网安备 33010602011771号