#include <iostream> /* 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 */ using namespace std; void sort_team( int * result, /*结果*/ int * order, /*比赛顺序*/ int** w1 , /*队伍实力对比*/ int begin, /*开始下标*/ int end, /*结束下标*/ int TEAM_NUM /*队伍数目*/ ) { int (*w)[TEAM_NUM] =(int (*)[TEAM_NUM] ) w1; int len=end-begin+1; if(len<2)return; int *p_tmp=new int[len]; //比赛顺序的临时copy //将比较顺序复制到临时存储 for(int i=0;i<len;i++){ p_tmp[i]=order[begin+i]; } int i=0, idx=0; for(;i<len-1;i+=2 , ++idx){ if(w[ p_tmp[i] ][ p_tmp[i+1] ]==p_tmp[i]){ //第一队赢 result[begin+idx]=p_tmp[i]; //败的一队排到最后,因为“同一轮淘汰的所有队伍排名不再细分,即可以随便排” result[end-idx]=p_tmp[i+1]; } else{ //第二队赢 result[begin+idx]=p_tmp[i+1]; result[end-idx]=p_tmp[i]; } } //最后一队落单,让赢的队再与其比赛一次 if(i==len-1){ if(w[ result[begin+idx-1] ][ p_tmp[i] ] == p_tmp[i] ){ result[begin+idx]=result[begin+idx-1]; result[begin+idx-1]=p_tmp[i]; } else{ result[begin+idx]=p_tmp[i]; } } delete [] p_tmp; if( idx > begin+1 ) sort_team(result, result, w1 , begin, idx - 1 ,TEAM_NUM ); //递归,在胜利的队伍分区继续比赛 } int main() { //team 2>team 1>team 3>team 0>team 4>team 5 int w[6][6] = { {0,1,2,3,0,0}, /*0队*/ {1,1,2,1,1,1}, /*1队*/ {2,2,2,2,2,2}, /*2队*/ {3,1,2,3,3,3}, /*3队*/ {0,1,2,3,4,4}, /*4队*/ {0,1,2,3,4,5} /*5队*/ }; int order[6] = {1,3,4,2,0,5}; int result[6]={0,}; int len=sizeof(order)/sizeof(*order); sort_team(result, order , (int **) w, 0 , len -1 , len ); for(int i=0;i<len;i++){ cout<<result[i]<<","; } cout<<endl; return 0; }
int (*)[NUM] 与 int *[NUM] 区别:
数组指针,指针数组
前一个的本质是指针,后一个的本质是数组。
int (*w)[TEAM_NUM] =(int (*)[TEAM_NUM] ) w1;