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;

你可能感兴趣的:(Google)