Dota遊戲匹配的所有組合

2021-07-28 15:16:16 字數 1374 閱讀 6266

在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 思路 兩張表...