数据结构与算法面试题80道(36)

36.引用自网友:longzuo

谷歌笔试:

n支队伍比赛,分别编号为012。。。。n-1,已知它们之间的实力对比关系,

存储在一个二维数组w[n][n]中,w[i][j] 的 代表编号为ij的队伍中更强的一支。

 

所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,

比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 43, 58.......

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

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

 

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

求出result

 

#include<iostream>
#include<stdio.h>
#include<vector>
#include<assert.h>
using namespace std;

#define N 5 //队伍数

void getResult(int (*w)[N],int *order,int *result,int groupNum){

    //确保程序的正确性
    assert(groupNum>0);

    int i=0,j=0;
    int cur=groupNum-1;//result数组游标
    vector<int>vOrder;
    for(i=0;i<groupNum;i++)
        vOrder.push_back(order[i]);

    while(vOrder.size()>1){
        for(vector<int>::iterator it=vOrder.begin();it!=vOrder.end();it++){
            if(it+1!=vOrder.end()){//防溢出
                if(w[*it][*(it+1)]==*it){//赢了将it+1放进result,并移除它
                    result[cur--]=*(it+1);
                    vOrder.erase(it+1);
                }else{//输了,呜呜,被移除
                    result[cur--]=*it;
                    vOrder.erase(it);
                }
            }

        }
    }

    if(vOrder.size()==1) result[cur--]=vOrder[0];
}

int main(){

    int w[N][N]={{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[N]={4,3,1,2,0};
    int result[N];
    getResult(w,order,result,N);

    for(int i=1;i<=N;i++)//注意,我的队伍是从1号开始的
        cout<<""<<i<<"名为"<<result[i-1]+1<<"号队伍\n";

    return 0;
}

 

 

 

这题很简单吧,动态维护一个order,赢了就留在order,输了就放入result,知道order中只剩一个

数据是在网上找的,和别人的对的到

posted @ 2016-03-15 15:42  dreamOwn  阅读(353)  评论(0编辑  收藏  举报