各マス目が属する区画を導き出す。9x9のマス目に候補値を設定する。全てのマス目の状態を表示する。全てのマス目の状態を表示する。$numを持つマス目の添字を返す。各マス目の候補を消去する。確定値と同一の候補を取り除く。候補値の出現が区域内で一回限りかどうかを調べる。"\n\n";}?>確定値を導き出すコードを、Reduceという名前を付けた関数としました。$xy");'というコードで、Exceptionオブジェクトを生成して、それをthrowしています。$e){...}'のcatch文にて受け取られます。ループのネストの深いところで起きた例外条件を認知するや否や、処理の制御を一気に特定箇所に移動させることができます。PHP5で可能になった便利な記述です。重複チェックについては、マス目に確定値を設定する前に重複を確認するようにしました。そのため、手順2を記述した部分において、候補値の文字列から確定値を取り除いた文字列を、いきなりマス目に戻していたのを改めました。3番目の引数が追加されています。区画内のマス目の候補値を走査して一つしか現れない数字を確定値とするわけですから、当該区画は重複チェックの対象から外せるわけです。この区画を示す添字を3番目の引数として渡すことで、不要なチェックをしないようにしています。他の呼び出し箇所では前の記述のままで、3番目の引数は記述されていません。-1)'としています。設定して呼び出したのと同じ扱いになるので、従来通りの動作をさせることができます。実行結果を下に記します。8回目の繰り返しで、すべてのマス目が確定したことが判ります。いうように、途中経過を表示しています。順調に確定値が見つかっていく様子が分かります。※右の文字列を入力してください。