题目:
谷歌笔试:
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。
答案:
//20130415
#include <iostream>
using namespace std;
void kout(int w[][5], int order[], int result[], int n)
{
int i = 0;
int j = 0;
memcpy(result, order, n*sizeof(int));
while (n > 1)
{
i = 0;
j = 0;
for (;j < n/2;)
{
if (order[i] == w[order[i]][order[i+1]])
{
result[j] = order[i];
result[n-1-j] = order[i+1];
}
else
{
result[j] = order[i+1];
result[n-1-j] = order[i];
}
i = i + 2;
j = j + 1;
}
if (n % 2 != 0)
{
result[j] = order[i];
n = n + 1;
}
n = n/2;
memcpy(order,result,n*sizeof(int));
}
}
int main()
{
int const n = 5;
int w[][5] = {
{0,1,0,3,0},
{1,1,2,3,1},
{0,2,2,2,4},
{3,3,2,3,3},
{0,1,4,3,4}
};
int order1[n] = {0,1,2,3,4};
int result1[n] = {0};
kout(w, order1, result1, n);
int const m = 4;
int s[][5] = {
{0,1,0,3},
{1,1,2,3},
{0,2,2,2},
{3,3,2,3}
};
int order2[m] = {0,1,2,3};
int result2[m] = {0};
kout(s, order2, result2, m);
return 0;
}