n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组 w[n][n]中,w[i][j] 的值代表编号为 i,j 的队伍中更强的一支。
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。
class CContest:public CTest { public: void Contest(int (*w)[3],int order[],int n,int result[]) { int *temOrder=new int[n]; memset(temOrder,0,n); int i,j,k; i=j=k=0; bool flag=true; int len=n; while(k<n) { int *pFrom,*pTo; if(flag){pFrom=order;pTo=temOrder;flag=false;} else{pFrom=temOrder;pTo=order;flag=true;} i=j=0; for(;i<len;i+=2) { if(i+1==len) { pTo[j++]=pFrom[i]; result[k++]=pFrom[i]; break; } if(w[pFrom[i]][pFrom[i+1]]==i) { pTo[j++]=pFrom[i]; result[k++]=pFrom[i+1]; } else { pTo[j++]=pFrom[i+1]; result[k++]=pFrom[i]; } } len=j; } i=0;j=n-1; for(;i<j;i++,j--) swap(result[i],result[j]); } void Test() { int w[3][3]={{0,1,2},{1,1,1},{2,1,2}}; int order[3]={0,1,2}; int result[3]; Contest(w,order,3,result); cout<<"比赛结果:"; for(int i=0;i<3;i++) cout<<setw(5)<<result[i]; cout<<endl; } }; }; using namespace Cracking; //修正后的求next数组各值的函数代码 void get_nextval(char const* ptrn, int plen, int* nextval) { int i = 0; nextval[i] = -1; int j = -1; while( i < plen-1 ) { if( j == -1 || ptrn[i] == ptrn[j] ) //循环的if部分 { ++i; ++j; //修正的地方就发生下面这4行 if( ptrn[i] != ptrn[j] ) //++i,++j之后,再次判断ptrn[i]与ptrn[j]的关系 nextval[i] = j; //之前的错误解法就在于整个判断只有这一句。 else nextval[i] = nextval[j]; } else //循环的else部分 j = nextval[j]; } } void main() { CTest *p=new CContest(); p->Test(); system("pause"); }