わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

レポート課題〜全消し&全消さず

いきなりですが問題です.

次の図は,パズドラのルールで消去判定をすると,右下の赤だけが残ります.

右下から開始して,パズドラのルールで移動させ,すべて消えるようにしてください.

消去判定は,簡単にいうと,縦または横に同じ色が3つ並べば消えます.重複可ですので,L字型や十字型,また4つ・5つと一直線につながっている状態でも,同時に消えることになります.
なぜ「右下の赤だけが残」るのかというと,下図のように線を引けば,他は,縦または横に同じ色が3つ並んでいるのが確められるからです.

移動にも,ルールがあります.指で動かして移動すると,移動の前後のマス(パズドラの用語ではドロップ)が交換されます.指を離すまで,上下左右に移動できます.今回,斜め移動は考えないものとします.
といったところで解答です.右下から,左に4つ移動すれば,次の図のようになり,全消しとなります.

さらにですが問題です.

次の図の右下から開始して,パズドラのルールで移動させ,すべてが消えないようにしてください.

こうなると,試行錯誤で求めるか,解を求めるプログラムを作るかを,選ばないといけません.
といったところで,これは何なのかというと,担当科目のレポート課題なのでした.Cのプログラミングですので,色マスにかえて文字で表現しています.charの2次元配列を,パズドラのルールで移動させて書き換え,パズドラのルールで消去判定して,結果を出力するという,120行程度のソースファイルを,こちらで作成しました.
学生はプログラムを打ち込み,その動作を見ていきながら,自作関数の役割や,構造体などを使って見通しよくするための修正の概略を,答案に書いてもらいました.恒例の「自分で問題を作って,それを解く」も,問6で課しました.
上の「全消さず」問題は,実際には「消える数をできるだけ少なくしたい.そのための移動方法(コマンドライン引数)と,消える個数を答えなさい」といった形で出題しました.
予想以上に多くの学生が,「全消さず」になる答えを書いていました.おそらく引数をあれやこれやと変更させ,試行錯誤で解を求めたものと思われます.
こちらとしては,解を求めるプログラムを作っておくべきだなと判断しまして,課題公表の前日に,1時間ほどで作成しました.ソースはGistからどうぞ.
このプログラムでは,整数値を1つ,コマンドライン引数から獲得します(デフォルトは5です).ちょうどその数だけ,右下を起点に移動し*1,消える数を求めます.それまでより少なければ,その移動方法を記憶しておきます.また「全消さず」になったら,ただちに終了します.
ソースファイルに,移動長が5から14までのそれぞれについて,最小となる移動方法と消える個数を書いています.「全消さず」になる最小の移動長は14で,左上右下左左上左左上右右上右と移動させます.指了図は以下のとおり.

レポート課題のソースファイルも,Gistに置きましたので,コンパイルして./4x5 lurdllullurrurをお試しください.


むかし書いたこと:

どうしても書いておきたい追記(1月22日)

ブロック崩さぬ*2には,そのネーミングにも,また実際に遊べる点においても,「負けた!」と思いました.

(最終更新:2014-01-22 朝)

*1:移動方法は,移動長により求められるすべての方法を試行しています.最初は左か上のいずれか,あとは上下左右ですので,移動長nの移動方法は2^{2n-1}通りです.

*2:逆転の発想「ブロック崩さぬ」人気 「往年の名作ゲームに真っ向からケンカ」 - ITmedia NEWS