/* 龍舟比賽,這題每次把勝者的編號保存下來,而後對他們進行比較,知道只剩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); }