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

来源:互联网 发布:c语言输出钻石图案 编辑:程序博客网 时间:2024/04/28 03:15

题目:

谷歌笔试:
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;}


原创粉丝点击