全方位木DP(ReRooting)の抽象化について

N 頂点の木において、v=1, 2, \dots, N を根としたときの○○をそれぞれ求めよ」というタイプの問題では、全方位木DP(ReRooting)が有効に働く場合が多いです。
根を1つ固定したときにこの問題が高速に解けるならば、全方位木DPを用いることで同じ計算量で全ての根についての問題を解くことが出来ます。
この記事では主に実装方法について述べるので、アルゴリズム自体の詳しい解説は他の方のブログを参照してください。

また、この記事を通して、根を固定して考えている際に「v を根とする部分木」と言った場合、親方向に辺が伸びるようなものは考えません。

全方位木DPの抽象化

この記事の本題です。
適当な頂点を根とした場合の木DPを考えます。
T を何らかの集合とし、 dp_v \in Tv を根とする部分木の何らかの場合の数/判定等とします。
このとき、木DPの遷移が

  • 2変数関数  f, g: T \times \mathbb{N} \rightarrow T
  • 可換モノイド  merge: T \times T \rightarrow T
  • v の子の集合 ch(v)

を用いて

\displaystyle dp_v = g(merge(f(dp_{c_1},c_1), f(dp_{c_2},c_2), \dots, f(dp_{c_k},c_k)),v) \ (c_i \in ch(v))

と表せるならば、後述する全方位木DPのテンプレートが使えます。モノイドが非可換な場合でもあらかじめマージの順番が決まっている場合は、隣接リストを適当にソートすることで対応できます。
f,g は第2引数に頂点番号を取りますが不要なことも多いです。 merge は2回目のDFSで左右から累積を取る際に結合則が必要であるため、モノイドでなければなりません。
これだけではわかりにくいと思うので、後程いくつか例を挙げます。

ソースコード

template <typename T>
struct ReRooting {
  using F = function<T(T, int)>;
  using F2 = function<T(T, T)>;
  int V;
  vector<vector<int>> G;
  vector<vector<T>> dp;
  // dp_v = g(merge(f(dp_c1,c1), f(dp_c2,c2), ..., f(dp_ck,ck)), v)
  F f, g;
  F2 merge;
  T mi;  // identity of merge

  ReRooting() {}
  ReRooting(int V, F f, F2 merge, T mi, F g)
      : V(V), f(f), merge(merge), mi(mi), g(g) {
    G.resize(V);
    dp.resize(V);
  }

  void read(int idx = 1) {
    int a, b;
    for (int i = 0; i < V - 1; ++i) {
      cin >> a >> b;
      a -= idx, b -= idx;
      G[a].emplace_back(b);
      G[b].emplace_back(a);
    }
  }

  void add_edge(int a, int b) {
    G[a].emplace_back(b);
    G[b].emplace_back(a);
  }

  T dfs1(int p, int v) {
    T res = mi;
    for (int i = 0; i < G[v].size(); ++i) {
      if (G[v][i] == p) continue;
      dp[v][i] = dfs1(v, G[v][i]);
      res = merge(res, f(dp[v][i], G[v][i]));
    }
    return g(res, v);
  }

  void dfs2(int p, int v, T from_par) {
    for (int i = 0; i < G[v].size(); ++i) {
      if (G[v][i] == p) {
        dp[v][i] = from_par;
        break;
      }
    }
    vector<T> pR(G[v].size() + 1);
    pR[G[v].size()] = mi;
    for (int i = G[v].size(); i > 0; --i)
      pR[i - 1] = merge(pR[i], f(dp[v][i - 1], G[v][i - 1]));
    T pL = mi;
    for (int i = 0; i < G[v].size(); ++i) {
      if (G[v][i] != p) {
        T val = merge(pL, pR[i + 1]);
        dfs2(v, G[v][i], g(val, v));
      }
      pL = merge(pL, f(dp[v][i], G[v][i]));
    }
  }

  void calc(int root = 0) {
    for (int i = 0; i < V; ++i) dp[i].resize(G[i].size());
    dfs1(-1, root);
    dfs2(-1, root, mi);
  }

  T solve(int v) {
    T ans = mi;
    for (int i = 0; i < G[v].size(); ++i)
      ans = merge(ans, f(dp[v][i], G[v][i]));
    return g(ans, v);
  }
};

変数f, g, mergeが先程述べた関数に対応しています。miはmergeの単位元です。
関数calc()を呼んだ後関数solve(i)を呼ぶことで、iを根とする場合の解が求まります。

追記:コンストラクタでE, dpをresizeするよう変更しました。(Codeforcesのようにテストケース式の場合、毎回MAX_V個のvectorを生成するとTLEするため)
さらに追記(2020/09/27):便利関数を追加し、その他修正を行いました。

使用例

例1. EDPC-V Subtree

問題リンク

V - Subtree

問題概要

N 頂点の木において、v=1, 2, \dots, N を根とする部分木の個数(を10^9+7 で割った余り)をそれぞれ求めよ。

解法

適当な頂点を根として考えます。(以下その他の問題でも同様)
dp_vv を根とする部分木の個数とします。
DPの遷移は

\displaystyle dp_v = \prod_{c \in ch(v)}(dp_c + 1)

となります。
よって  f(a,v) = a+1, \ merge(a,b) = ab, \ g(a,v) = a とすればよいです。

提出コード:
atcoder.jp

例2. Codeforces Round #627 (Div. 3) F

問題リンク

Problem - F - Codeforces

問題概要

各頂点が白または黒のいずれかで塗られた N 頂点の木がある。
v=1, 2, \dots, N を含む部分木の(白の頂点数)-(黒の頂点数)の最大値をそれぞれ求めよ。

解法

dp_vv を根とする部分木(v を必ず含む)の(白の頂点数)-(黒の頂点数)の最大値とします。
c \in ch(v) について、dp_c が正ならその部分木を v に接続し、そうでなければ接続しないのが最適です。
したがって、 w_ii 番目の頂点が白のとき1、黒のとき-1とすると、DPの遷移は

\displaystyle dp_v = \sum_{c \in ch(v)}(max(dp_c,0)) + w_v

となります。
よって f(a,v) = max(a,0), \ merge(a,b) = a+b, \ g(a,v) = a+w_v とすればよいです。

提出コード:
codeforces.com

例3. ABC160-F Distributing Integers

問題リンク

F - Distributing Integers

問題概要

N 頂点の木に1からN までの数字を昇順に1つずつ書き込む。
v に1を書き込み、その後は記入済みの頂点に隣接する頂点に書き込んでいく。
v=1, 2, \dots, N それぞれについて書き込み方の総数(を10^9+7 で割った余り)を求めよ。

解法

 cnt_vv を根とする部分木に v から数字を書き始める書き込み方の総数、 size_vv の子孫の数(v 自身も含む)とします。
 size_v =\sum_{c \in ch(v)}size_c +1 は簡単にわかります。
 cnt_v は、2からsize_v の数字をどの子部分木に割り当てるか決めた後、条件を満たすように数字を書き込む場合の数であるため、

\begin{eqnarray}
cnt_v &=& \frac{(size_v-1)!}{ \prod_{c \in ch(v)}size_c!} \times \prod_{c \in ch(v)}cnt_c \\
  &=& (size_v-1)! \prod_{c \in ch(v)} \frac{cnt_c}{size_c!}
\end{eqnarray}

となります。
数えるものが2つあるのでテンプレが使えないように思えますが、cnt_vsize_v をペアで考える、すなわち T = \mathbb{N} \times \mathbb{N} とすることで上手くいきます。
求める関数は( f, g の第2引数は使わないので省略)

 f : (c,s) \mapsto (\frac{c}{s!}, s),
 merge : ( (c1,s1), (c2,s2) ) \mapsto (c1c2, s1+s2),
 g : (c,s) \mapsto (cs!, s+1)

となります。 merge単位元(1,0) です。g は本来ならば  size_v に1を加えてから cnt_v を計算するところを直接求めているため、c(s-1)! ではなく cs! となっています。

提出コード:
atcoder.jp

おわりに

全方位木DPは毎回書くとしんどいのでテンプレ化してみてもいいかもしれません。全ての木DPがこの形で書けるかどうかはわかりませんが(書けなさそう)、多くの木DPはこの形に帰着できると思います。
誤字・脱字や意見等があればご報告ください。

テトリス学入門

0.はじめに

この記事はCCS Advent Calendar 2019の13日目の記事として作成されました.(遅刻してごめんなさい!!!)

 

前の記事:

homu-neko.hatenablog.com

 

次の記事:

glvntla.hatenablog.com

 

 

また,この記事はCCSアドカレ講義シリーズ3時限目も兼ねています.

1時限目:スプレンダー学続論Ⅰ

2時限目:ぷよぷよ基礎A

3時限目:テトリス学入門(いまここ)

4時限目:開幕テンプレ派生概論

5時限目:Coming Soon...

 

 

 

今回はテトリス入門ということで,テトリスを全くプレイしたことがない,もしくはテトリスを最近始めたけどどうすれば勝てるのかわからない......といった方を対象とします.

テトリス上級者の方には少し物足りないかもしれません.

 

なお,この記事での“テトリス”とは,『テトリス99』及び『ぷよぷよテトリス』,その他ワールドルール準拠のテトリスを指すものとします.

昔のものとは大きく仕様が異なるのでご注意ください.

 

この記事で紹介しきれなかった細かい仕様は,実際にやって体で覚えてください.

 

なおこれを書いている今現在中間テストとレポートに追われているので,段々説明が雑になるのは許してください.許して 許

 

 

1.テトリスとは?

一番初めに,テトリスとは何かを簡単に記します.

 

テトリスとは,横10マス,縦20マスの盤面に4マスからなるブロック(テトリミノという)を落とす落ち物パズルの一種です.

横1列がブロックで全て埋まるとその列が消え,上にあったものが消した列数分落ちてきます.

 

昔のテトリスはただこれだけのルールで,一人で消した段数やスピード,スコアを競うものでした.

 

......しかしそれだけでは面白みがないので,ワールドルールというルールが生まれました.これは今現在では主流のルールとなっています.(もっと言うと,テトリスガイドラインでこれが定められたのでほぼ全てこのルールになっている)

 

基本ルールは従来のテトリスそのままで,一人ではなく複数人で同時にプレイし,相手の盤面の下から消した列数や消し方に応じたお邪魔(1列から1マス欠けたもの)がせり上がってきて,先に上まで達した方の負けというルールです.

 

また,後述するスーパーローテーションシステム(SRS),いわゆる「スピン」という意味不明なシステムが搭載され,戦略性や積み方,操作技術がとても多様になり,深みのあるゲームへと昇華されました.

 

 これ以降のテトリスは,変態Tスピン,暴力的なREN,前衛芸術のような各種テンプレートを駆使して相手を殴り合うゲームになります.

 

 

操作の説明も簡単にしておきます.

 

左右キー...ミノの移動.

上キー...ミノのハードドロップ.一気に下まで落とせる.

下キー...ミノのソフトドロップ.ゆっくり落ちる.

A、B…それぞれミノの右回転,左回転.

L...ミノのホールド.後で使いたいミノをホールド枠に移す.何もホールドしていない場合は次のミノを呼び出し,ホールドしている場合はそのミノを呼び出す.

 

 

2.各種ミノの特徴

テトリミノは7種類あります.

f:id:null_mn:20191123035706j:plain

各種テトリミノ

 

 左上から順にIミノJミノLミノOミノSミノTミノZミノと呼ばれます.色と形は1対1に対応しているので,色で覚えましょう.名前はアルファベットの形が元となっていますが,別に覚えなくても大丈夫です.

 

 

そして非常に重要な仕様として,ミノの(出てきた際の)回転軸は次のようになっています.

f:id:null_mn:20191123042035p:plain

ミノの回転仕様(黒丸が回転軸)

 

これを見ればわかる通り、実はOミノ以外のミノは全て上下の区別があります。

特にI,S,Zはひっくり返しても見た目が同じですが、内部では上下が区別されています。

そのため、出てきてすぐ右回転をするのと、上下ひっくり返してから右回転をするのでは微妙に回転後の位置が異なります。また後述のスピンをする際も、上下を誤ると思い通りに回転しなくなります。

初心者が陥りやすいミスなので注意。

 

 

各ミノの特徴についても軽く解説します。

 

Iミノ

強い。唯一4列消し(テトリス)ができる。置きミスのリカバリにも役立つ。置き場所ない場合はとりあえずホールドしておけばOK。

JミノLミノ

使いやすい.S, Zと相性がいい.スピン(後述)も直感的でわかりやすい.

SミノZミノ

使いにくい.が,スピンを覚えればリカバリに役立つ(ときもある).

Oミノ

めちゃくちゃ使いずらい.これがnext欄に見えたら身構えるくらいの気持ちで.ホールドに置いておくと死ぬので,早めに消費しよう.

Tミノ

神.このゲームにおいて最強のミノ.これなしで現代テトリスは成立しないと言っても過言ではない.盤面修正,T-spinなど,無限の可能性を持つ.Iミノより優先的にホールドに入れるべき.

 

 

要点をまとめると,

・Oミノは邪魔なので優先的に処理する

・Iミノは強い

・Tミノはもっと強い

です.最初はこれだけ覚えればOKです.

 

これらのミノが出てくる順番は,基本ランダムですが,完全にランダムというわけではありません.

具体的には,初めの7個は7種類のミノが1種類ずつ出てきて,次の7個も1種類ずつ出てきて,......というのが繰り返されます.(重要)

 

これを覚えておくと次にどんなミノが出てきそうかをある程度予測できます.

 

 

3.スーパーローテーションシステム(スピン)

昔のテトリスでは,回転後のミノとすでに置かれているブロックが重なる場合は回転できませんでした.

 

しかし,スーパーローテーションシステム(スピン)の導入により,通常回転できない場合は補正が入り,回転の軸が移動するようになりました.

 

回転軸の移動パターンは複数あり,優先順位がつけられています.優先順位の高い方から見ていき,回転可能なものが見つかった場合,それに沿って回転します.

具体的な回転の仕様はここに書くには余白が狭すぎるので,代わりとして仕様が詳細に記されている記事を紹介させていただきます.

 

qiita.com

 

 

また,Tミノを補正回転させて(補正じゃない形もありますが)列を消すと,T-spinと呼ばれる技になります.

T-spinは現代テトリスの象徴であり,通常のライン消しの2倍以上もの火力(攻撃力)を誇ります.これができれば初心者卒業です.

T-spinがどのようなものかは,上手い人の動画を見るとわかると思います.見てください.

 

 

4.火力について

対戦型テトリスでは、列の消し方に応じて相手にお邪魔を送ることができます。

火力(送れる段数)は次のようになっています。細かい説明は後でするので何となくわかれば大丈夫です。

 

テトリス99(初期火力)、ぷよぷよテトリス(vsテトリス

通常の消し方

・1列消し…0列

・2列消し…1列

・3列消し…2列

・4列消し(テトリス)…4列

T-spin

・T-spin mini(1列消し)…0列

・T-spin single(1列消し)…2列

・T-spin double(2列消し)…4列

・T-spin triple(3列消し)…6列

ボーナス

・Back-to-Back…+1列

・REN(連続消し)

REN 0 1 2 3 4 5 6 7 8 9 10 11~
火力ボーナス 0 0 1 1 2 2 3 3 4 4 4 5

 

その他

・パーフェクトクリア(全消し)…10列(他と重複しない)

 

 

ぷよぷよテトリス(vsぷよぷよ

ぷよぷよテトリスでぷよ相手の場合は,消すたびに左にあるゲージがたまり,RENが途切れた瞬間にぷよ側に送られます.

通常の消し方

・1列消し…0pt

・2列消し…1pt

・3列消し…2pt

・4列消し(テトリス)…4pt

T-spin

・T-spin mini…0pt

・T-spin single(1列消し)…2pt

・T-spin double(2列消し)…3pt

・T-spin triple(3列消し)…4pt

 

ボーナス

・Back-to-Back…+1pt

・REN(連続消し)

REN 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15~
火力ボーナス 0 0 1 1 1 1 1 2 2 2 2 3 3 3 3 4

 

その他

・パーフェクトクリア(全消し)…6pt(他と重複しない)

 

 

……どうでしたか?

とりあえず,先ほど述べたT-spinは火力が高いことがわかります.通常と同じ列数消すだけで倍の火力が送れるのでコスパがとてもいいですね.

上級者の動画などを見ると,Tミノをぐるぐる回して奇怪な動きをしているのが見て取れますが,その理由は火力が高いからです.

 

また,RENのボーナスもかなり重要だとわかります.実際ぷよテトのvsテトリスだと、

15RENまで続いた場合は

0+0+1+1+2+2+3+3+4+4+4+5+5+5+5+5=49列ものお邪魔を送ることができ,相手は死にます.ただこのレベルのRENを行うには専用の積み方が必要なので,はじめはなんとなく繋がればラッキー程度に思っておいてください.

 

Back-to-Backは,T-spinかテトリスを撃ったあと,1列も消さずに(連続で消す必要はない)再びT-spinかテトリスを撃つと付くボーナスです.ただはじめはT-spinを連続で撃つのは難しいので,「テトリスを連続で撃つと強い」程度の認識で大丈夫です.

 

パーフェクトクリアは普通にやるとまず出ません.盤面にブロックが少なくても,そこからパーフェクトクリアに繋げるのはめちゃくちゃ難しいので下手に狙わないようにしましょう.

 

5.平積み,テトリス積み

平積みとは,文字通り平らに積むことです.

テトリス積みは,端1列だけIミノを刺す用の穴を開けておいて平積みを行う積み方です.

 

f:id:null_mn:20191213002755p:plain

テトリス積み.Iミノを右に刺すとテトリス

 

平積みは全ての基本であり,テトリスにおける「地力」であると考えています.

 

 

平積みする上でのコツをいくつか紹介します.

 

・高さ3以上の穴を作らない

高さ3以上の穴をきれいに埋められるのはIミノだけです.そのため高さ3以上の穴をいっぱい作ると,Iミノが何本も必要な地形になりリカバリが大変です.

初心者の方はこれだけでも意識するようにするとかなり改善すると思います.

 

・長方形を作る

次のような長方形を形成するようにすると,きれいに積める上に脳の負担が減るのでオススメです.

f:id:null_mn:20191213005012p:plain

 

この形は90°単位で回転させても組めるので,色で覚えるようにしましょう.

加えてスピンを覚えれば,例えば上図左下の組み方だと,Zミノを最後に入れることもできます.(が,最初は覚えなくていいです.)

 

・Tミノをそのまま置かない

Tミノを平らなところに“⊥”となるよう置くと,それだけで地形が悪くなります.Tの平置きはやめましょう.

 

 

<発展>

テトリスにはパリティという概念があります.

これは,盤面を白黒でマーブルに塗ったときの白と黒の偏りのことです.

 

ミノごとのパリティを考えると,Tミノ以外は白と黒が同数であるのに対し,Tミノは白と黒に偏りがあります.

f:id:null_mn:20191213005833p:plain

 

よって,列を消さないものとすると,盤面のパリティはTミノを置いたときにのみ変動します.

 

パリティが偏っている」ことと「盤面がデコボコしている」ことはほぼ同じなので,Tによって崩された盤面は,Tを置くことでしか再生できません.

(正確には,空中でラインを消してもパリティが変化し得る)

先ほどTの平置きをやめようと言ったのも,平ら(≒パリティが整っている)な部分のパリティを崩してしまうためです.

 

なんとなく盤面が悪いと感じたときは,Tの置き所をじっくり考えると良いでしょう.

 

余談ですが,パリティの考え方はパーフェクトクリアを狙う際に真価を発揮します.またいつか語るかもしれません.

 

 

6.お邪魔の消化,「掘り」

当然ですが,相手からお邪魔を送られ続けると死にます.

そのためお邪魔を下まで消す,いわゆる「掘り」の技術も重要です.

 

掘るときに気を付けてほしいことは実は一つしかありません.それは.

「穴の上にミノを置かない」

ことです.

 

例えば次のような盤面があったとします.あと2列掘れればテトリス穴に辿り着けるため,素早く掘りたい場面です.

f:id:null_mn:20191213063651p:plain

 

ここでもし左にIミノを置いたとします.

f:id:null_mn:20191213063708p:plain

 

すると......

f:id:null_mn:20191213063632p:plain



下の一列を消すために,その上を4列も消さなくてはならなくなります.

これは最初にIミノを上から2列目のお邪魔の穴の上に置いてしまったのが原因です.

 

このように,お邪魔の穴の上にミノを置くとお邪魔が掘れなくなるので気をつけましょう.

ちなみにこの場合はLJを使うと,低い姿勢を保てるため速く掘れます.

f:id:null_mn:20191213050238p:plain

f:id:null_mn:20191213050249p:plain

f:id:null_mn:20191213050301p:plain

 

7.T-spinの種類,組み方

高火力を誇るT-spinについてもう少し紹介します.

 

T-spinの種類

T-spin mini

壁に沿わせるように回転させて1列(ごくまれに2列)消す場合が多い.単体の火力は0なのであまり狙う必要はない.

 

T-spin single

1列消し.1列消すだけでかなりのお邪魔を送れる(特に対ぷよ)なので積極的に狙いたい.

 

T-spin double

一番使うやつ.つよい.これが組めれば初心者卒業です.

 

T-spin triple

3列消すだけで6列(vsテトリス)ものお邪魔を送れるが,組むのが難しい,撃った後の形が良くないなどのデメリットも目立つので,すぐに組めるとき以外は狙わないのが吉.

 

 

T-spin miniとT-spin singleは何が違うの?と思うかもしれませんが,これは消したときのTの周りのブロックによって決まります.

説明するのが難しいので,先ほど紹介した記事を参照してください.

 

大体のT-spin singleは,T-spin doubleの形から1列欠けたような形が多いです.

 

(追記:改めて見ると説明が雑なので,おすすめのサイトを紹介しておきます.T以外のスピンの説明も充実しているので必見.)

 

喜竹屋本舗―テンプレ積み保管庫(T-spin)

喜竹屋本舗―テンプレ積み保管庫(全てのミノのスピン)

 

 

T-spinの組み方

~簡単な組み方~

 

Tの形の穴を見つけます.

f:id:null_mn:20191213041737p:plain

 

適当に屋根を付けます.

f:id:null_mn:20191213041800p:plain

 

できました.

f:id:null_mn:20191213041826p:plain

 

これが最も基本的なT-spinの作り方です.

 

ただ,Tの形の穴が都合よくあることはそう多くないので,もう少し実践的な作り方を紹介します.

 

~お邪魔を使った組み方~

ブロック1個分の穴を見つけます.

f:id:null_mn:20191213042300p:plain

 

屋根を付けます.

f:id:null_mn:20191213042323p:plain

 

周りを適当に埋めて完成.

f:id:null_mn:20191213042344p:plain

 

平らなお邪魔の上にSまたはZミノを横に置くことで,簡単にT-spin doubleの形が組めます.縦置きより横置きの方が地形がきれいなのでオススメ.

かなり強いので余裕があれば撃ちましょう.横を埋めずにsingleを撃っても強いです.

 

テトリス積みをしているとき,テトリス穴が端以外にある場合は,次のようにT-spin doubleを組むことでテトリスもT-spinも打てる最強の形になります.積極的に狙いましょう.

f:id:null_mn:20191213043752p:plain

 

 

<発展>

テトリス穴が端にある場合もT-spinを撃つことができます.

この場合はテトリス穴の上に組むのではなく,穴を一旦塞いで別の場所で撃つことになります.

 

次のような地形があります.

f:id:null_mn:20191213043235p:plain

 

あえて右の穴を塞ぎ,T-spinの形を作ります.

f:id:null_mn:20191213043321p:plain

 

T-spinを撃つと......

f:id:null_mn:20191213043410p:plain

 

テトリス穴が復活します.

f:id:null_mn:20191213043435p:plain

 

この技はドネイトと呼ばれ,これを使うことで火力を定期的に送りながらテトリスを狙うことができます.

ドネイトは非常に多くのテンプレがあるので,興味がある方は是非調べてみてください.

 

また段数計算をミスるとテトリス穴が塞がったままになるので気をつけましょう.

(ただ大抵の場合は勝手に消えてくれるので多少適当でも大丈夫です)

 

 

8.開幕テンプレ

最初の方で紹介したように,テトリスのミノの順(ツモ順という)は完全にランダムなわけではありません.そのため,「これが来たらこう組む!」というのを事前に練習しておくことが可能です.

もちろん組めない場合も多いので,組めるかどうかはnext欄を見て判断する必要があります.

 

ただ本音を言うと,開幕テンプレの有無は勝敗とあまり関係がありません.

初めはテトリス積みと時々T-spinを撃つだけで十分勝てます.

 

そうは言っても覚えるに越したことはないので,有名なものを2つだけ紹介します.

 

DT砲

Double→Tripleと撃つのでDT砲.

組める確率が高い&火力が高いの最強テンプレ.

開幕で11列送れるため,これを撃つだけで優位に立てます.

 

組み方は次の通り.(他にも組み方あるので気になったら調べてね)

 

f:id:null_mn:20191213061912p:plain

 

Tをトの字にして3回左回転

→同様にして2回左回転

で撃てます.

f:id:null_mn:20191213062036p:plain

f:id:null_mn:20191213062045p:plain

f:id:null_mn:20191213062057p:plain

f:id:null_mn:20191213062104p:plain

f:id:null_mn:20191213062112p:plain

f:id:null_mn:20191213062122p:plain

f:id:null_mn:20191213062129p:plain

f:id:null_mn:20191213062139p:plain


LJが早いと組みやすく,T,S,Z辺りが早いと組みにくいです.

 

 

開幕TSD

素早く4列送れる便利な技.

撃った後の地形も低いのでgood.

f:id:null_mn:20191213062919p:plain

f:id:null_mn:20191213062932p:plain

 

Iが早いと組みやすく,Tが早いと組みにくい.

 

 

開幕テンプレについてもっと知りたい方は,次のglvntlaさんの記事を読みましょう.

 

9.終わりに

今回は初心者向けということで,書く内容をかなり厳選したつもりです.

これを読んでテトリスを始める人が増えればとても嬉しいです.

 

いつか中級者向けに記事を書く機会があれば,

・最適化

・攻撃を受けるタイミング

・4列RENのコツ

・開幕パフェ,連パフェのコツ

・マイナーな開幕テンプレ,中盤テンプレ

あたりを書きたいなぁと思ってます.

 

 

最後に,おまけのクイズを1つ.

 

Q.Tミノしか出てこないテトリスでパーフェクトクリアは撃てるか?

 

 

 

 

 

 

 

 

 

(答えは下に)

 

 

 

 

 

 

 

 

 

 

 

 

 

A.できる

以下はその一例です.

f:id:null_mn:20191213054334p:plain

f:id:null_mn:20191213054342p:plain

f:id:null_mn:20191213054352p:plain

 

パーフェクトクリアは奥が深いのでいつか語りたいですね.



ここまで読んでいただき,ありがとうございました.