您的位置:首页 > 职场人生

30. 谷歌面试题:n支队伍比赛,分别编号为0,1,2。。。。n-1

2014-03-21 23:43 246 查看
题目:

n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w

中,w[i][j]
的值代表编号为i,j的队伍中更强的一支。所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order
中,比如order

= {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......

胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,

下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名

编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result
,求出result。

分析:

这题不难,只需要不断地遍历order表,直到找到所有对比结果。

实现如下:

#include<iostream>

using namespace std;

#define N 5
void GetResult(int (*w)
, int* order, int* result)
{
        int i = 0;
        int k = 1;
        int j = N -1;
        while(1)
        {
                i = 0;
                if(i + k > N -1)
                {
                        result[j] = order[0];
                        break;
                }
                
                while(i + k <= N-1)
                {
                        int ii = order[i];

                        int jj = order[i+k];
                        if(w[ii][jj] == ii)
                                result[j--] = jj;
                        else
                        {
                                result[j] = ii;
                                order[i]= order[i+k];
                                order[i+k] = result[j];
                                j --;
                        }
                        i = i + 2*k;
                }
                k *= 2;
        }
}

int main()
{
        int a[5][5] = {{0,1,2,3,4},{1,1,2,3,4},{2,2,2,3,4},{3,3,3,3,4},{4,4,4,4,4}};
        int order[5] = {4,3,1,2,0};
        int result[5];
        GetResult(a, order, result);

        int i = 0;
        cout << "result order: ";
        while(i < 5)
        {
                cout << result[i++] << ",";
        }
        cout << endl;
}


输出结果为:

result order: 4,0,2,1,3,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐