以下のような9x9の矩形がある。このうちどの場所の3x3の矩形を取り出しても1から9の数字が一意になるように数字を配置する。
普通に考えたら3個先に配置していけば出来そう。
星一つ問題だし,それで行けそうかな?と思ったので,それらしきプログラムを作る。
void pad( int irow, int icol, int val) { if( irow < 0 || irow >= 9) return; // 範囲外 if( icol < 0 || icol >= 9) return; if(!(mat[irow][icol]==0||mat[irow][icol]==val)) { // 既に値が設定されていて,設定しようとする値と異なれば問題あり pe( "ERROR [%d][%d] : %d => %d\n", irow, icol, mat[irow][icol], val); ynFind = NO; } if( mat[irow][icol]) return; // 既に値が設定されている場所 mat[irow][icol] = val; // 新しい値を設定する。 pad( irow+3, icol+0, mat[irow][icol]); // 3つ右に同じ値を設定する。 pad( irow-3, icol+0, mat[irow][icol]); // 3つ左に同じ値を設定する。 pad( irow+0, icol+3, mat[irow][icol]); // 3つ下に同じ値を設定する。 pad( irow+0, icol-3, mat[irow][icol]); // 3つ上に同じ値を設定する。 } void pad_start( int irow, int icol) { pad( irow+3, icol+0, mat[irow][icol]); pad( irow-3, icol+0, mat[irow][icol]); pad( irow+0, icol+3, mat[irow][icol]); pad( irow+0, icol-3, mat[irow][icol]); } int main( int argc, cstring argv[]) { // 初期状態を設定する。 mat[0][0] = 8; mat[4][0] = 7; mat[8][0] = 6; mat[0][4] = 1; mat[0][8] = 2; mat[4][8] = 3; mat[8][4] = 5; mat[8][8] = 4; // 3個先を同じ数字で埋める。 pad_start( 0, 0); pad_start( 4, 0); pad_start( 8, 0); pad_start( 0, 4); pad_start( 0, 8); pad_start( 4, 8); pad_start( 8, 4); pad_start( 8, 8); ……… }
答えが出たよ。いかにも答えを出すためのプログラムって感じ。
以下の図でと
を入れ替えて見ると,両図とも,どこから3x3の矩形を切り出してもA〜Iの文字を含む。
だけを含む3x3の矩形を切り出すことが出来ないから。
を含む3x3の図形を切り出すと必ず
が含まれる。
そうすると答えは沢山あるってこと?
問題文は「残りのマスを全部,数字で埋めてください」ってある。この文からは答えは一つって感じがするんだけど…
越後製菓のきなこ餅「ふんわり名人」がうまい。昔はきなこなんて大嫌いだったのに,不思議だ。
解速度
即