この課題でC++の勉強をしたと言えるほどC++の経験が浅いのでソースはとても汚いのですが、今回は、マスの一つ一つをクラスにしました。m×nの盤面の各マスはまずframeクラスの二次元配列として定義され、そのマスが数字の入るべきマスであればnumcellクラスへのポインタを、ヒントが入っているマスであればhintcellクラスへのポインタを持ちます。さらにhintcellクラスは、右へ向けてのヒントと下に向けてのヒントのそれぞれを、hintsクラスへのポインタとして持ちます。
frameクラスとhintcellクラスはそれぞれのポインタをメンバとして持ち、numcellクラスは入るべき数字の可能性の一覧と、縦ヒントと横ヒントへのポインタを持ちます。最後にhintsクラスは、そのヒントに属するマスを埋めるのに、まだ使える数字の一覧、ヒントの数字、ヒントの数字から確定した数字の和を引いたものをメンバとして持ちます。
次に、hintsクラスの持つまだ使える数字の一覧と、numcellクラスの持つ入る数字の可能性の一覧は、一つのint型の変数で、次のように表されます。
(16進表示) 0x91FF 頭の桁は、まだ使って ↑ ここ以下のbitは、 いない数字の個数 左から9~1に対応するフラグこれの頭の桁の数字が1になったら、その数字マスは確定したことになります。その数字を計算で切り出すにはlogを使うか、最下位1bitが0でなくなるまで右シフトして、その回数を数えなくてはいけないので、ここではcase文による対応表を使いました。逆に数字をこの形式にするには、その数字をkとした場合、1をk-1(bit)左にシフトして、それに0x1000を足せばよいので、こちらは簡単です。