【問題1】  6×6の場合、最少でいくつの○を置き換えれば、条件を満たすことができるでしょうか。  またその場合の配置を示してください。 (答え)7個   ○×○○○○   ○○○○×○   ○○×○○○   ×○○○○×   ○○○×○○   ○×○○○○ 【問題2】  7×7の場合、最少でいくつの○を置き換えれば、条件を満たすことができるでしょうか。  またその場合の配置を示してください。  問題1より簡単かもしれません。 (答え)9個   ○○○○×○○   ○○×○○○○   ×○○○○×○   ○○○×○○○   ○×○○○○×   ○○○○×○○   ○○×○○○○ 【問題3】  5×5の場合、最少個数5個の解は何通りあるでしょうか。 (答え)プログラム(最後に添付)による探索の結果、反転対称解(鏡像解)を同一として     数えた場合は、以下の11個。別物とした場合は、48個 1 : ( 0, 0 ) ( 1, 1 ) ( 2, 2 ) ( 3, 3 ) ( 4, 4 ) 2 : ( 0, 0 ) ( 1, 1 ) ( 2, 2 ) ( 3, 4 ) ( 4, 3 ) 3 : ( 0, 0 ) ( 1, 2 ) ( 2, 3 ) ( 3, 1 ) ( 4, 4 ) 4 : ( 0, 0 ) ( 1, 2 ) ( 2, 4 ) ( 3, 1 ) ( 4, 3 ) 5 : ( 0, 0 ) ( 1, 3 ) ( 2, 2 ) ( 3, 1 ) ( 4, 4 ) 6 : ( 0, 0 ) ( 1, 3 ) ( 2, 2 ) ( 3, 4 ) ( 4, 1 ) 7 : ( 0, 0 ) ( 1, 3 ) ( 2, 4 ) ( 3, 1 ) ( 4, 2 ) 8 : ( 0, 0 ) ( 1, 3 ) ( 2, 4 ) ( 3, 2 ) ( 4, 1 ) 9 : ( 0, 0 ) ( 1, 4 ) ( 2, 2 ) ( 3, 3 ) ( 4, 1 ) 10 : ( 0, 1 ) ( 1, 0 ) ( 2, 2 ) ( 3, 4 ) ( 4, 3 ) 11 : ( 0, 1 ) ( 1, 4 ) ( 2, 2 ) ( 3, 0 ) ( 4, 3 ) 【おまけ】  n×nの場合は最少でいくつの○を置き換えれば、条件を満たすことができるでしょうか。  nの式で表してください。 (答え)最小の×の数をR(n)、n=5*k+m(kは自然数、mは0〜4の整数)とすると、     R(n)=5*k**2 + 2*k*m + δ(m)      ただし、δ(M)= 0   m=0,1,2の場合              = 1   m=3の場合              = 3   m=4の場合   (説明)  境界を意識しないで済むような大きなパネル上に○が敷き詰められているものとする。  このパネル上に×のマークを桂馬跳びの要領で以下の図のようにつけていく。      ●○○○○|●○○○○|●○○○○   ○○○●○|○○○●○|○○○●○  注:見易さために、×の代りに●で表示   ○●○○○|○●○○○|○●○○○    5個毎に仕切り(−,|)を入れて   ○○○○●|○○○○●|○○○○●    あるが、この仕切りは無視してよい   ○○●○○|○○●○○|○○●○○   (斜めの関係を見るときはない方がよい)    ------------------------------   ●○○○○|●○○○○|●○○○○   ○○○●○|○○○●○|○○○●○   ○●○○○|○●○○○|○●○○○   ○○○○●|○○○○●|○○○○●   ○○●○○|○○●○○|○○●○○   ------------------------------   ●○○○○|●○○○○|●○○○○    ○○○●○|○○○●○|○○○●○   ○●○○○|○●○○○|○●○○○   ○○○○●|○○○○●|○○○○●   ○○●○○|○○●○○|○○●○○  この配置には以下のような特徴がある。   (1)任意の×とその隣の×との距離は、縦・横・斜めの全てが丁度4つの○を間に置いている   (2)任意の位置から5x5のパネルを切り出すと、丁度5個の×が含まれる   (3)任意の位置から5xm又はmx5のパネルを切り出すと、丁度m個の×が含まれる  (1)から、×の配置の仕方として全く無駄のないものとなっている。  従って、このパネルからnxnの小パネルを切り出す場合に、×の数が最小となるような位置を選      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  定すれば、nxnの求める答えの1つとなる。  ^^^^^^^^^^^^^^^^^^^^    具体的な×の数を求めるため、n=5*K+m (m=0〜4)として、nxnのパネルを  以下の小パネルに分解して考える。    a)5kx5kのパネル    b)5kxmのパネル    c)mx5kのパネル    d)mxmのパネル  a)は、5x5のパネルがk**2個と考えることができるので、上記の(2)により×の  数は、その位置によらず、5*k**2個となる。また、b),c)も5xm、mx5のパ  ネルがk個と考えられるので、上記の(3),(4)により×の数は、その位置によらず、  それぞれがk*m個となる。  d)のmxmのパネルの場合は、どの位置に配置するかに依存して×の数が変わる。×の最  小となる数をδ(m)とすると、以下のようになる。(最初の図を良く見るとわかる)     δ(m)= 0  m=0,1,2の場合           1  m=3の場合           3  m=4の場合  以上をまとめると、以下の式となる。        R(n)=5*k**2 + 2*k*m + δ(m)  なお、問題1,2の場合は、それぞれR(6)=7,R(7)=9となる。  ------------ 問題3の探索プログラム ---------------------------------------------- def exe() : out = open("log.txt","w") M = 5 C = 0 D = 0 for hash in range(0,120) : Pos = toPos(hash,M) if Check(Pos) == 0 : continue D += 1 if DupCheck(Pos,out) == 0 : continue C += 1 Line = " %3d : " % (C) for k in range(0,5) : Line += " ( %d, %d )" % (k,Pos[k]) WriteLog(out,Line) Check(Pos) WriteLog(out," Dup %d " % (D)) out.close() ### def Check(Pos) : U = 0 V = 0 for i in range(0,len(Pos)) : j = Pos[i] if (i == j) : U = 1 if (i+j == 4) : V = 1 if (U == 0) | (V == 0) : return 0 return 1 ## def toPos(Hash,M) : h = Hash Pos = [] for k in range(0,M) : Pos += [0] for k in range(0,M) : n = 6 - M + k p = h % n h = h / n Pos[M-k-1] = p for i in range(M-2,-1,-1) : for j in range(i+1,M) : if Pos[i] <= Pos[j] : Pos[j] += 1 return Pos ## def DupCheck(Pos,out) : for t in range(0,8) : w = Pos if (t & 0x01) != 0 : u = [[],[],[],[],[]] for k in range(0,len(Pos)) : u[k] = 4 - w[k] w = u if (t & 0x02) != 0 : u = [[],[],[],[],[]] for k in range(0,len(Pos)) : u[k] = w[4-k] w = u if (t & 0x04) != 0 : u = [[],[],[],[],[]] for k in range(0,len(Pos)) : u[w[k]] = k w = u if Pos > w : return 0 return 1 ### def WriteLog(out,Line) : print Line out.write(Line+"\n") out.flush() -------(終わり)------------------------------------------------------------------------