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);
}
相關文章
相關標籤/搜索