36。 龙舟比赛

/*
     龙舟比赛,这题每次把胜者的编号保存下来,然后对他们进行比较,知道只剩1个胜者
 */

#include<iostream>
using namespace std;

int w[6][6] = {   
        0,1,2,3,0,0,   
        1,1,2,1,1,1,   
        2,2,2,2,2,2,   
        3,1,2,3,3,3,   
        0,1,2,3,4,5   
    };   

int order[6]={1,3,4,2,0,5};
int result[6]={-1};

void play(int n)
{
    /*
         首先声明1个order副数组
         假如n=偶数,那么比较1此只有n/2个人留下
         n=奇数,比较一次有(n+1)/2个人留下,我们用order_fu来保存留下的人
         n=1的时候,就是剩的人了,没人比较的话就是胜利
        */
    int *order_fu=new int[n];
    int i,j,count;
    int cc=n;    
    while(n!=1)
    {
        j=0;
        count=n;
        for(i=0;i<n;i+=2)
        {
            if(i+1<n)// n双
            {
                if(w[order[i]][order[i+1]]==order[i])
                {
                    order_fu[j++]=order[i];
                    result[order[i+1]]=count--;
                }
                else
                {
                    order_fu[j++]=order[i+1];
                    result[order[i]]=count--;
                }
            }
            else //
            {
                order_fu[j++]=order[i];
            }
        }

        //再复制给order
        if(n%2==0)
            n=n/2;
        else
            n=(n+1)/2;
        for(i=0;i<n;i++)
            order[i]=order_fu[i];
    }
    
    result[order_fu[0]]=1;
    //输出result
    for(i=0;i<cc;i++)
        cout<<i+1<<":"<<result[i]<<endl;
    cout<<endl;

    delete []order_fu;
}

int main(void)
{
    play(6);
}

 

posted on 2013-08-20 15:44  紫金树下  阅读(226)  评论(0编辑  收藏  举报