朝日新聞2006年6月30日のパズル横丁問題

問題

以下のような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の図形を切り出すと必ずが含まれる。

そうすると答えは沢山あるってこと?

問題文は「残りのマスを全部,数字で埋めてください」ってある。この文からは答えは一つって感じがするんだけど…

 

越後製菓のきなこ餅「ふんわり名人」がうまい。昔はきなこなんて大嫌いだったのに,不思議だ。

解速度