30. 谷歌面试题:n支队伍比赛,分别编号为0,1,2。。。。n-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。


分析:

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


实现如下:

#include<iostream>


using namespace std;

#define N 5
void GetResult(int (*w)[N], 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,


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值