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");
}

  

posted on 2013-08-05 11:47  dyc0113  阅读(411)  评论(0编辑  收藏  举报

导航