あなたは謎のプログラムのソースコードを見つけた.
さっそくコンパイルして実行してみたが,いつまで待っても処理が終わらない.
どうやら,プログラムが無限ループしてしまっているようである.
ソースコードを詳しく見てみたところ,以下のようなことがわかった.
ソースコードは N 行からなり,各行はラベル文か goto 文のいずれかである.
ラベル文と goto 文はそれぞれ次のようなフォーマットに従っている.
LABEL:
goto LABEL;
ここで,LABEL はラベルを表す文字列である.
プログラムは先頭の行から順番に 1 行ずつ処理される.
ラベル文と goto 文を処理したときの挙動は次のとおり:
最後の行を処理し終えて次に処理する行がなくなったとき,プログラムは終了する.
あなたは,いくつかの goto 文を削除することでプログラムを正しく終了させたいと思っている.
一方で,手を加える箇所はできるだけ少なくしたい.
プログラムを終了させるためには最小でいくつの goto 文を消せばいいだろうか.
N s_1 . . . s_N
s_i は次の二つのうちのいずれかである.
LABEL_i: goto LABEL_i;
削除すべき goto 文の最小個数を 1 行に出力せよ.
2 LOOP: goto LOOP;
1
8 goto there; loop: goto loop; here: goto goal; there: goto here; goal:
0
1 GOTO:
0