在dota遊戲中有一種匹配玩法,任意5人以下玩家組隊,加入匹配系統,由系統組合出5人 vs 5人的組合進行遊戲,比如2人+3人 vs 1人+4人。抽象出這個問題,就變成兩邊各有m個玩家,最多允許n個人組隊(n <= m),計算所有的組合方式。思路是,先考慮單邊陣營的組合,比如5人,可以1+4,2+3,1+1+1+1+1...,用遞迴的方式可以計算出所有的單邊陣營組合。將單邊陣營的組合兩兩配對,就獲取到雙邊陣營的組合。假設單邊組合有n個,那麼雙邊組合就會有c(n, 2)個。但是這裡面會有重複的組合,還得把重複的組合去掉。
void testladderrule()
}// 引數:陣營人數,最多允許組隊人數
void ladderrule( int ncampmbr, int nmaxteammbr )
if (nsum > ncampmbr)
else
}else
rule[nmaxteammbr] = 0;
--nteammbr;
bupamount = true;
} }// 將單邊陣營的規則兩兩組合,形成匹配規則
for (size_t i = 0; i < camprules.size(); ++i)
; char *chpos = chrule;
int nlength = 1024;
for (int k = 0; k < ncampmbr; ++k)
// 剔除重複的匹配規則
if (usedrules.count(chrule))
continue;
usedrules.insert(chrule);
sprintf_s(chpos, nlength, "| ");
chpos += 2;
nlength -= 2;
// 左邊陣營規則
for (int k = 0; k < ncampmbr; ++k)
sprintf_s(chpos, nlength, "| ");
chpos += 2;
nlength -= 2;
// 右邊陣營規則
for (int k = 0; k < ncampmbr; ++k)
matchrules.push_back(chrule);
} }sort(matchrules.begin(), matchrules.end());
printf("match rules' amount: %d\n", matchrules.size());
for (auto it = matchrules.begin(); it != matchrules.end(); ++it)
delete rule;
}
**:
Dota中卡爾技能總數的組合數量
問題 在遊戲dota2中,有一位非常強大的英雄 卡爾,他有三種屬性 冰 火 雷.同時卡爾身上有三個無順序的屬性槽,他可以從三種屬性中任意選擇3個放入屬性槽中,然後通過當前的屬性組合召喚技能.每種不同的屬性組合 都可以為卡爾召喚出不同的技能,共有10種組合 1 冰冰冰 2 冰 3 冰冰雷 4 火 5 ...
求字元的所有組合!
求字元的所有組合,列如輸入三個字元a,b,c,則它們的組合有a,b,c,ab,ac,bc,abc。求n個字元的長度為m的組合分成兩個子問題 求n 1個字串長度為m 1的組合,以及求n 1個字元長度為m的組合。include include includeusing namespace std inc...
所有球隊的比賽組合
問題 一張team表,裡面只有乙個欄位name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,現在四個球對進行比賽,用一條sql語句顯示所有可能的比賽組合.答案 select a.name,b.name from team a,team b where a.name b.name 思路 兩張表...