大学院のM1を対象にしたプログラミング能力試験を受けた 2

http://d.hatena.ne.jp/caligue/20080716
問題文は載せられないが、問題の解説を書こう。

Problem A
与えられたint型のデータをバブルソートでソートして、swapした回数を出力せよ。という問題。バブルソートのやり方は問題文に書かれているので悩む部分は全然ない。

Problem B
入力で与えられるインデントが崩れたJavaソースコードをネストの深さにあわせて、読みやすくインデントしたコードを出力せよ。という問題。条件として、一行にブレースか一命令しかないという制約があったので簡単。まず、getlineで一行づつ読み込み、その行から先頭のスペースをカットする。あとはネストの深さにあわせて適宜インデントしたあとにその、スペースをカットした文字列を出力して行けばOK。ネストの深さはスタックの考え方が分かっていれば解ける。開きブレース'{'が来たら一つ深くし、閉じブレース'}'が来たら一つ浅くすればいい。

Problem C
与えられた平方六面体(AxBxC)で表されるチーズが、半径Rの穴を通れるかどうかを判定せよ。という問題。A^2+B^2,A^2+C^2,B^2+C^2の3値のなかで最小のものが、(2R)^2より小さければ、穴を通り抜けられる。問題文からは(3値の最小値)==(2R)^2の場合には通り抜けられるのかどうかの記述がなかったので、分からずWrong Answerを何度もくらった。判定では通り抜けられないようになっていた。

Problem D (Optional)
与えられた0と1だけの二次元配列において、横、縦、斜めに連続して並んでいる1の数の最大値を求めよ。という問題。つまり、
00010
00100
11001
10000
10100
の時は(3,0)から右上方向へは4つ連続して1が並んでいて、それがこの配列での連続している1の数の最大値なので、答えは4ということになる。
僕は単純にループをまわして最大値を求めるより、再帰を使った方がスマートに解けると思ったので、再帰を使って実装。間違えることなくすんなり解けた。説明は面倒なので省略。
このエントリを書き終わってコードを見直したら、バグを発見。配列のインデックス-1の要素にアクセスする可能性がある。なぜこれで通ったんだろう。判定が甘いのか?