以下のような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の図形を切り出すと必ず
が含まれる。
そうすると答えは沢山あるってこと?
問題文は「残りのマスを全部,数字で埋めてください」ってある。この文からは答えは一つって感じがするんだけど…
越後製菓のきなこ餅「ふんわり名人」がうまい。昔はきなこなんて大嫌いだったのに,不思議だ。
解速度
即