■
敗者側振り分けについて。
個人的にはとっても大発見なのだけど、それが他人に伝わらない悲しさ。
とりあえず式にすると以下のような感じ。
勝者側のラウンド番号 :R
勝者側の試合番号 :N
勝者側の最終ラウンド番号 : M
として、
ラウンド'R'の
'N'番目の試合で負けたプレイヤーは
敗者側のラウンド'X'の
'Y'番目の試合に入る。
で敗者側のラウンドXを求める関数は
int returnX(R)
{
if(R == 1){
return 1;
}else{
return 2*R-2;
}
}
これは少し考えれば自明。
本題のY番目を求める関数だが、従来はN番目で負けたプレイヤーはN番目の試合とそのまま流していた。
で、そのままだと同じ相手とガツガツ当たるので新提案
int returnY(R, N, M)
{
if(R == 1){
return N;
}else if(R == M){
return 1; // 敗者側決勝戦は1試合しかないので固定
}else{
if(R%2 == 1){
return R+1;
}else{
return R-1;
}
}
}
InputとOutputを並べると
N→Y
-
-
- -
-
1→2
2→1
3→4
4→3
…
という風に奇数と偶数の位置を逆にしているだけ。
これだけで綺麗に敗者側が組み合わさる。
可能性が倍倍になってすぐ重なってしまうと前回の妄想では結論付けていたけど
勝者側から新たな負けプレイヤーが来る場合のみ可能性を倍にして
敗者側同士の勝負では可能性を広げない、という戦略をとったのだ。
これによって、かならず準決勝で初めてすべての可能性が重なるトーナメント表の生成が可能。
"何人プレイヤーが集まってもプレイヤーの重なり具合が均一なダブルイリミネーショントーナメント"
である可能性が非常に高いのが嬉しいところ。