/*
* 谷歌笔试:
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。
*/
//思想 类似于把数组中的*放到数组的最后的题目
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#define N 9
void swap(int *a,int *b)
{
if(*a != *b)
{
*a^=*b;
*b^=*a;
*a^=*b;
}
}
void gameEliminate(int order[],int w[][N],int result[],int n)
{
int i,k;
memcpy(result,order,sizeof(int)*n);
while (n > 1)
{ //一轮的情况,一直把赢家放前面,k指向的是输家
for (i = 0, k = 0; i < n; i += 2)
{
int win =
i == n - 1 ? i :
(w[result[i]][result[i + 1]] == result[i] ? i : i + 1);
swap(result+k, result+win); //当win==k时实际上没有交换。
++k;
}
n=k;
}
}
void pr_2arr(int w[][N],int n)
{
int i=0,j;
for(i=0;i<n;++i)
{
for(j=0;j<=i;++j)
{
printf("%d ",w[i][j]);
}
printf("\n");
}
}
void pr_arr(int arr[],int n)
{
int i =0;
for(;i<n;i++) printf("%d ",arr[i]);
printf("\n");
}
void initWinArr_radom(int w[][N],int n)
{
srand(time(0));
int i=0;
for(i=0;i<n;i++) w[i][i]=i;
for(i=1;i<n;i++)
{
int k=0;
for(k=0;k<i;++k)
{
w[i][k]=w[k][i]= random()%2 ? i : k;
}
}
}
int main(void) {
int order[]={4,3,5,8,1,2,6,7,0};
int n=sizeof(order)/sizeof(int);
int result[n];
int w[n][n];
initWinArr_radom(w,n);
//pr_2arr(w,n);
gameEliminate(order,w,result,n);
pr_arr(result,n);
return 0;
}