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;

原文地址:https://www.cnblogs.com/wucg/p/1858260.html