わかりました、試してみましょう。8 人の生徒 (1..8) と 4 つのセクションがあります。各学生はセクションに分かれており、各セクションには 2 人の学生用の部屋があります。ほとんどの学生は切り替えを望んでいますが、全員ではありません。
下の表では、学生の現在のセクション、必要なセクション、キューの位置 (ある場合) を確認できます。
+------+-----+-----+-----+
| stud | now | req | que |
+------+-----+-----+-----+
| 1 | A | D | 2 |
| 2 | A | D | 1 |
| 3 | B | B | - |
| 4 | B | A | 2 |
| 5 | C | A | 1 |
| 6 | C | C | - |
| 7 | D | C | 1 |
| 8 | D | B | 1 |
+------+-----+-----+-----+
この情報をグラフで表示できます。
+-----+ +-----+ +-----+
| C |---[5]--->1| A |2<---[4]---| B |
+-----+ +-----+ +-----+
1 | | 1
^ | | ^
| [1] [2] |
| | | |
[7] | | [8]
| V V |
| 2 1 |
| +-----+ |
\--------------| D |--------------/
+-----+
空室のある区画を探しますが、空室がありません。すべてのセクションがいっぱいなので、裏技が必要です。それでは、空でないキューを持つランダムなセクションを見てみましょう。この場合、セクション A と仮定すると、余分な位置があります。これは、学生 5 がセクション A に入ることができることを意味し、学生 7 が占有するセクション C に空席が残ります。これにより、学生 2 が占有するセクション D に空席が残ります。現在、セクション A に空席があります。 A には追加の位置があるため、この仮定を削除して、より単純なグラフを得ることができます。
パスがセクション A に戻らない場合は、移動を元に戻し、A を無効な開始点としてマークします。別のセクションで再試行してください。有効なセクションが残っていない場合は終了です。
現在、次のような状況があります。
+-----+ +-----+ +-----+
| C | | A |1<---[4]---| B |
+-----+ +-----+ +-----+
| 1
| ^
[1] |
| |
| [8]
V |
1 |
+-----+ |
| D |--------------/
+-----+
別のランダムなセクションでトリックを繰り返すと、グラフが解決されます。
現在割り当てられていない複数の学生から始める場合は、開始点として追加のダミー セクションを追加します。もちろん、これはいずれかのセクションに欠員がなければ問題が解決できないことを意味します。
キュー内の順序が原因で、解決策がない可能性があることに注意してください。