您的位置:首页 > 其它

n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组 w[n][n]中,w[i][j] 的值代表编号为 i,j 的队伍中更强的一支。

2013-08-05 11:47 274 查看
n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系,
存储在一个二维数组 w

中,w[i][j] 的值代表编号为 i,j 的队伍中更强的一支。
所以 w[i][j]=i 或者 j,现在给出它们的出场顺序,并存储在数组 order
中,
比如 order
= {4,3,5,8,1......},那么第一轮比赛就是 4 对 3, 5 对 8。.......
胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,
下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是 4 对 5,直至出现第一名
编程实现,给出二维数组 w,一维数组 order 和用于输出比赛名次的数组 result

求出 result。

class CContest:public CTest
{
public:
void Contest(int (*w)[3],int order[],int n,int result[])
{
int *temOrder=new int
;
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");
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐