『今週の問題』第196回 解答


◆広島県 清川 育男 さんからの解答

【問題1】

●●□□●
□□□□□
□●□□□
□□□□□
□□□●□

□□□□□
□□□□●
□□□●□
●□□□□
●□□□●
【おまけ1】

280 通り。

【問題2】

●●□□□□
□□□●□□
□□□□□□
□□□□□●
□□□□□□
□□●□□●

□□□□□●
□□□□□□
□□□□□●
□□●□□□
●●□□□□
□□□□□●
【おまけ2】

16 通り。

【おまけ3】

7*7

1  3 10 21 22 41 49
1  4 15 16 41 45 49
1  5  9 34 35 46 49
1  9 28 29 40 47 49
3  7 13 29 30 43 46
4  7 20 21 37 43 47
5  7 12 15 28 37 43
7 13 22 35 38 43 45
8通り。

8*8 解なし。


◆千葉県  菜花子 さんからの解答


◆静岡県 medaka さんからの解答

【問題1】

石の位置を●で表す。

○○○○●
○○○●○
○○○○○
○○○○●
●●○○○
考え方:なるべく距離の長い配置を先に決定し、残り石で調整した。

【問題2】

(答え) (2つしかない解のうちの1つ)

●○○○○○
○○○○●●
○○○●○○
●○○○○○
○○○○○○
●○○○○○
【おまけ1】

(答え) 5x5の解の数    35通り。
ただし、鏡像解を別解としてカウントする場合は280通り。

(解法)

プログラムによる探索で全数を求めた。
(プログラムは、最後に添付)

5x5の領域を2x3の4つの領域A,B,C,Dと中央に1x1のEの領域に分けて考える。
2x3の領域の中に配置された石の配置をもとめ、それを基に、5x5の領域の配置を求めた。
(2x3の領域に配置できる石の数は最大で3個である)

【おまけ2】

(答え) 6x6の解の数    以下の2通り。
ただし、鏡像解を別解としてカウントする場合は16通り。

●○○○○○
○○○○●●
○○○●○○
●○○○○○
○○○○○○
●○○○○○
 
○○○●○●
○○○○○○
○●○○○○
○○○○○●
●○○○○○
●○○○○○
(解法)

プログラムによる探索で全数を求めた。
(プログラムは、5x5と類似しているので割愛した)

6x6の領域を3x3の4つの領域A,B,C,Dに分けて考える。
3x3の領域の中に配置された石の配置をもとめ、それを基に、6x6の領域の配置を求めた。
(3x3の領域に配置できる石の数は最大で3個である)

◆5x5の配置を求めるプログラム

##### 20004.04.18
#
#    Size = 5

def  exe() :
     global Ans

     out = open("w5log.txt","w")

     M  = Init(out)
 
     Ans   = []
     Total = 0 
     for E in range(0,2) :
         for A in range(3,1,-1) :
             for B in range(A,-1,-1) :
                 for C in range(A,-1,-1) :
                     if  C > B  :  continue
                     D = 5 - (A+B+C+E)
                     if  D < 0  :  continue
                     if  D > A  :  break
  
                     Cnt = Join(M,A,B,C,D,E,out)
                      
                     Total += Cnt
                     WriteLog(out,"\n  (%d,%d,%d,%d,%d)   :  %4d  %4d" % (A,B,C,D,E,Cnt,Total))

     out.close()

###
def  Init(out) :
     global  BitMask
  
     BitMask = [1L]
     for i in range(1,34) :  BitMask += [BitMask[i-1] << 1]
     
     M = [[],[],[],[]]

     for k in range(0,64) :
         b = Bits(k)
         if  b > 3  :  continue

         w = k
         p = 0
         pos = []
         while  w != 0 :
             if  w & 0x01 :  pos += [[p%3,p/3]]
             w  = w >> 1
             p += 1
 
         [m,pos2] = NormCheck(0,[],pos)
         if  m == -1   :  continue

         M[b] += [[k,pos]]

#     for i in range(0,4) :
#         WriteLog(out,"\n  ==== %d ====" % (i))
#         k = 0
#         for e in M[i] :
#             k += 1
#             Line = "  %2d " % (k)
#             for pos in e[1] :
#                 Line += " [%d,%d]" % (pos[0],pos[1])
#             WriteLog(out,Line)
 
     return M

###
def  NormCheck(Mask,Pos,Pos2) :
     global BitMask

     pos = Pos + Pos2
     m   = Mask
     for i in range(len(Pos),len(pos)) :
         for j in range(0,i) :
             dx = pos[i][0] - pos[j][0]
             dy = pos[i][1] - pos[j][1]
             d2 = dx*dx + dy*dy
             if m & BitMask[d2]  :  return [-1,[]]
             m |= BitMask[d2]

     return [m,pos]

###
def  Join(M,A,B,C,D,E,out) :

     if  E == 0 :  
         me = 0L
         Pe = []
     else   :
         me = BitMask[2*5+2]
         Pe = [[2,2]]

     Cnt = 0     
     for [a,pa] in M[A] :
         [ma,Pa] = NormCheck(me,Pe,pa)
         
         for [b,pb] in M[B] :
             pb2 = Shift(pb,3,0,1) 
             [mb,Pb] = NormCheck(ma,Pa,pb2)
             if  mb == -1 :  continue
                  
             for [c,pc] in M[C] :
                 pc2 = Shift(pc,0,2,1) 
                 [mc,Pc] = NormCheck(mb,Pb,pc2)
                 if  mc == -1 :  continue

                 for [d,pd] in M[D] :
                     pd2 = Shift(pd,2,3,0) 
                     [md,Pd] = NormCheck(mc,Pc,pd2)
                     if  md == -1      :  continue

                     Cnt += DupCheck(Pd,out)

     return Cnt

###
def  Shift(Pos,dx,dy,t) :
     if  Pos == []  :  return []
     pos = []
     for [x,y] in Pos :  
         if  t == 0 : pos += [[x+dx,y+dy]]
         else       : pos += [[y+dx,x+dy]]
     return pos

###
def  DupCheck(Pos,out) :
     global Ans,BitMask
          
     V = BitMask[33]
     for t in range(0,8) :
         pos = []
         v   = 0L
         for [x,y] in Pos :
             if  t & 0x01 :  x = 4-x
             if  t & 0x02 :  y = 4-y
             if  t & 0x04 :  
                 w = x
                 x = y
                 y = w
             pos += [[x,y]]
             v |= BitMask[5*y+x] 

     
         V = min(v,V)
     
     for ans in Ans :
         if ans == V :  return 0
     Ans += [V]
     printMap(out,len(Ans),V)

     return 1 

###
def  Bits(K) :
     w = K
     c = 0
     while w != 0 :
        c += 1
        w = w & (w-1)
     return c
           
###
def  printMap(out,Cnt,Map) :
     Line ="\n%4d  " % (Cnt)
     WriteLog(out,Line)
  

     C = ["○","●"]
     map = Map
     for i in range(0,5) :
         Line = "      "
         for j in range(0,5) :
             m = map & 0x01
             map = map >> 1
             Line += C[m]
        
         WriteLog(out,Line)

###
def  WriteLog(out,Line) :
     print Line
     out.write(Line+"\n")
     out.flush()

7x7の解は、以下の1つ。
探索時間は、45秒。(Pentium4 1.4GHz)

○○○○●○●
○○○○●○○
●○○○○○○
○○○○○○●
○○○○○○○
○●○○○○○
●○○○○○○
8x8の解は,存在しない。
探索時間は、約12分。


◆補足

『16個以上の石をバラバラに配置する解は存在しない』ことの補足説明です。

1.準備(用語の定義など)

(1)a、bを0以上の整数とし、自然数mが(a2+b2)で表すことができるとき、mをノルム数と呼ぶことにする。
また、その構成要素を[a,b]と表記する。

[a,b]の次数をmax(a,b)と定義する。

mの表記の中で次数が最小となる表記を既約表記とする。

ex. 25=[0,5]=[3,4]の場合、[3,4]が既約表記となる
5=[1,2]の場合は、(1つしか存在しないので)、[1,2]が既約表記となる

注:2つの石の間のX軸、Y軸の差分をそれぞれa,bとすると、[a,b]は、距離の2乗に対応する。

(2)L(N):NxNのパネルに配置できる2つの石の間の距離が異なるものの数とする。

L(N)は、次数(N−1)以下の既約表記の数に等しい。

 

N≦21については、添付ファイルを参照されたい。

(3)R(N):N個の石をバラバラに配置したとき、必要となる異なる距離の種類の数。
R(N)= N*(N−1)
となる。

(4)δL(N) = L(N) − L(N-1) と定義する。

L(N)の定義から、L(N-1)からL(N)になることで増えるのは、
[0,N-1],[1,N-1],[2,N-1],... [N-1,N-1]のN個の中で既約表記となっているものだけである。

従って、δL(N)≦Nとなる。

(5)δR(N) = R(N) − R(N-1) と定義する。
 (3)より、δR(N)=N−1となる。

以上より、N個の石をバラバラに配置できるためには、
L(N)≧R(N)であることが必要である。

もし、『N≧16の場合、L(N)<R(N)』が成立すれば、バラバラの配置の解は存在しない。

N=16では、この条件が成立しているので、
添付のR(N),L(N)の計算結果を参照)
N>16で、δL(N)≦δR(N)が成立すれば、もとの命題も成り立つことになる。

2.命題 『N>16の時、δL(N)≦δR(N)が常に成り立つ』

(4)、(5)より、δL(N)≦N、δR(N)=N−1であるから、
δL(N)の中に既約表記でないものが1つでも含まれていれば、命題が成立することになる。

1)n = 5*k の場合(k>3)

[0,n] = [0,5*k]
= (5*k)2
= (3*k)2 + (4*k)2
= [3*k,4*k]

k>3では、[0,5*k]の次数は、[3*k,4*k]より大きいので、
[0,5*k]は既約表記ではない。

2)n = 5*k+1 の場合(k≧3)

[2,n] = [2,5*k+1]
= (5*k+1)2 + 22
= 25*k2 * 10*k + 5
= (3*k-1)2 + (4*k+2)2
= [3*k-1,4*k+2]

k≧3では、[2,5*k+1]の次数は、[3*k-1,4*k+2]より大きいので、
[2,5*k+1]は既約表記ではない。

3)n = 5*k+2 の場合(k≧3)

[1,n] = [1,5*k+2]
= (5*k+2)2 + 12
= 25*k2 * 20*k + 5
= (3*k+2)2 + (4*k+1)2
= [3*k+2,4*k+1]

k≧3では、[1,5*k+2]の次数は、[3*k+2,4*k+1]より大きいので、
[1,5*k+2]は既約表記ではない。

4)n = 5*k+3 の場合(k≧3)

[4,n] = [4,5*k+3]
= (5*k+3)2 + 42
= 25*k2 * 30*k + 25
= (3*k+5)2 + (4*k)2
= [3*k+5,4*k]

k≧3では、[4,5*k+3]の次数は、[3*k+5,4*k]より大きいので、
[4,5*k+3]は既約表記ではない。

5)n = 5*k+4 の場合(k≧3)

[2,n] = [2,5*k+4]
= (5*k+4)2 + 42
= 25*k2 * 40*k + 20
= (3*k+4)2 + (4*k+2)2
= [3*k+4,4*k+2]

k≧3では、[2,5*k+4]の次数は、[3*k+4,4*k+2]より大きいので、
[2,5*k+4]は既約表記ではない。

1)〜5)のいずれの場合も、命題は成り立っている。
従って、N≧16の場合、L(N)<R(N)が成り立つので、『16個以上の石をバラバラに配置する解は存在しない』ことになる。


◆福岡県 昼行灯 さんからの解答

【問題1】

思ったよりも難しいですね。
適当においてもなかなか正解が出ませんし、きれいな解法が思い浮かびません。

仕方が無いのでPGで解くと

5×5の場合 280パターン
6×6の場合 16パターンです。

5×5の場合
※番号と枠が対応してます。

0102030405
0607080910
1112131415
1617181920
2122232425


01 02 05 12 24 
01 02 05 14 24 
01 02 08 10 25 
01 02 08 16 25 
01 02 08 21 24 
以下 省略

全結果はこちらです。

計280パターン


6×6の場合

010203040506
070809101112
131415161718
192021222324
252627282930
313233343536

01 02 10 24 33 36 
01 03 06 22 29 35 
01 03 17 19 30 36 
01 04 06 21 26 32 
01 04 13 27 35 36 
01 07 18 20 34 36 
01 11 12 16 19 31 
01 13 22 29 30 31 
02 08 15 31 34 36 
03 06 18 28 31 32 
04 06 14 24 25 31 
05 06 09 19 31 34 
05 11 16 31 33 36 
06 07 08 15 24 36 
06 12 13 23 31 33 
06 18 21 25 26 36  
計16パターン


解答の追加です。

前回は全パターンをそのまま数えていましたが、90度回転及び裏表反転の同一パターンの組み合せが8パターンありますね。
検出された組み合わせを8で割ると以下のようになりました。

マス目   組合せ
3×3    5
4×4   23
5×5   35
6×6    2
7×7    1
8×8    0
9×9    0
10×10  0
10×10の時点でプログラム(VB)の実行時間が7時間でしたので11×11は止めました。
6×6までは5秒程度7×7は1分程度ですが、それ以降は飛躍的に組合せのパターンが上がるので当然の結果ですが。

プログラムで解けば簡単ですが、理論的に考えようとすると・・解法が浮かびません。
他の人の解答に期待です。

ちなみに7×7の場合

01020304050607
08091011121314
15161718192021
22232425262728
29303132333435
36373839404142
43444546474849


01 03 10 21 22 41 49
01 04 15 16 41 45 49
01 05 09 34 35 46 49
01 09 28 29 40 47 49
03 07 13 29 30 43 46
04 07 20 21 37 43 47
05 07 12 15 28 37 43
07 13 22 35 38 43 45
です。
これらは90度回転、及び裏表反転すると全て同一のパターンになります。


◆浜田 明巳 さんからの解答

いずれもエクセルのマクロで解いた.
N×N個(N=5,6)のマスの中からシラミつぶしでN個を選び,任意の2個間の距離の2乗を求める.
2乗にしたのは,コンピュータは近似値(切り捨て)なので,ルート計算を避ける為である.
それらの距離の2乗の中で1つでも等しいものがあれば,捨て去り,等しいものがなければ,それを答とし,表示する.

【問題1・おまけ1】

次の35通り.ただし対称解は除いてある.
もし対称解を含めるのなら8倍の280通り.

 ちなみに8倍となるのは,上下対称,左右対称,右上がり対角線対称,右下がり対角線対称,90°回転,180°回転,270°回転の7種類が,1つの本質解と重複しているからである.

11001
00000
01000
00000
00010

11001
00000
00010
00000
00010

11000
00101
00000
00000
00001

11000
00100
00000
10000
00001

11000
00100
00000
00000
10010

11000
00100
00000
00000
01001

11000
00100
00000
00000
00101

11000
00010
00000
00000
01010

11000
00001
00010
00000
00001

11000
00001
00000
00010
00001

11000
00000
10010
00001
00000

11000
00000
10000
00010
00100

11000
00000
10000
00010
00001

11000
00000
01000
10000
00001

11000
00000
00000
00100
10010

11000
00000
00000
00100
01001

11000
00000
00000
00010
01001

10110
00000
00000
00001
00100

10100
00100
00000
00000
10010

10100
00011
00000
00000
10000

10100
00010
00000
00001
10000

10100
00000
00001
00110
00000

10100
00000
00001
00010
00010

10100
00000
00000
10000
00110

10100
00000
00000
00110
00001

10100
00000
00000
00011
00100

10010
01000
00000
00000
00110

10010
00000
00000
01000
01010

10010
00000
00000
01000
00110

10001
01000
01000
00000
01000

10000
01001
00000
00011
00000

10000
01001
00000
00010
00010

01100
10000
00000
00101
00000

01100
00000
01000
00001
00010

01000
10000
00011
00000
00010
【問題2・おまけ2】

次の2通り.ただし対称解は除いてある.
もし対称解を含めるのなら8倍の16通り.

110000
000100
000000
000001
000000
001001

101001
000000
000000
000100
000010
000010
【参考】

ちなみにN=7の場合は次の1通りになる.

1010000
0010000
0000001
1000000
0000000
0000010
0000001

Option Explicit
Public N As Integer
Sub Macro1()
    Dim a(6) As Integer
    For N = 5 To 6
      If N = 5 Then
        Sheets("Sheet1").Select
        Columns("B:F").Select
      Else
        Sheets("Sheet2").Select
        Columns("B:G").Select
      End If
      Selection.ColumnWidth = 1.88
      Selection.ClearContents
      Cells(1, 1).Value = 0
      Range("A1").Select
      '
      Call saiki(1, a())
    Next N
End Sub
Sub saiki(ByVal i As Integer, ByRef a() As Integer)
    Dim b(6, 6) As Integer
    Dim x(1) As Integer
    Dim y(1) As Integer
    Dim d2(15) As Integer '15=6*5/2
    Dim kosuu As Integer
    Dim j1 As Integer
    Dim j2 As Integer
    Dim j3 As Integer
    Dim j4 As Integer
    Dim bb As Integer
    Dim onaji As Integer
    Dim chigau As Integer
    Dim gyou As Integer
    If i = 1 Then
      a(1) = 1
    Else
      a(i) = a(i - 1) + 1
    End If
    While a(i) <= N * N - (N - i)
      If i < N Then
        Call saiki(i + 1, a())
      Else
        kosuu = 0
        For j1 = 1 To N - 1
          x(0) = f(a(j1), 0)
          y(0) = f(a(j1), 1)
          For j2 = j1 + 1 To N
            x(1) = f(a(j2), 0)
            y(1) = f(a(j2), 1)
            kosuu = kosuu + 1
            d2(kosuu) = (x(1) - x(0)) * (x(1) - x(0)) + (y(1) - y(0)) * (y(1) - y(0)) '距離の2乗
          Next j2
        Next j1
        onaji = 0
        j1 = 1
        While onaji = 0 And j1 <= kosuu - 1
          j2 = j1 + 1
          While onaji = 0 And j2 <= kosuu
            If d2(j1) = d2(j2) Then
              onaji = 1
            Else
              j2 = j2 + 1
            End If
          Wend
          j1 = j1 + (1 - onaji)
        Wend
        If onaji = 0 Then
          For j1 = 1 To N
            For j2 = 1 To N
              b(j1, j2) = 0
            Next j2
          Next j1
          For j1 = 1 To N
            b(f(a(j1), 0), f(a(j1), 1)) = 1
          Next j1
          j1 = 1
          While onaji = 0 And j1 <= 7
            j2 = 1
            While onaji = 0 And j2 <= Cells(1, 1).Value
              gyou = j2 * (N + 1) - N
              chigau = 0
              j3 = 1
              While chigau = 0 And j3 <= N
                j4 = 1
                While chigau = 0 And j4 <= N
                  Select Case j1
                    Case 1
                      bb = b(j3, N + 1 - j4) '上下対称
                    Case 2
                      bb = b(N + 1 - j3, j4) '左右対称
                    Case 3
                      bb = b(j4, j3) 'y=x対称
                    Case 4
                      bb = b(N + 1 - j4, N + 1 - j3) 'y=n+1-x対称
                    Case 5
                      bb = b(N + 1 - j4, j3) '90°回転
                    Case 6
                      bb = b(N + 1 - j3, N + 1 - j4) '180°回転
                    Case Else
                      bb = b(j4, N + 1 - j3) '270°回転
                  End Select
                  If Cells(gyou + j3 - 1, j4 + 1) <> bb Then
                    chigau = 1
                  Else
                    j4 = j4 + 1
                  End If
                Wend
                j3 = j3 + 1
              Wend
              If chigau = 0 Then
                onaji = 1
              Else
                j2 = j2 + 1
              End If
            Wend
            j1 = j1 + 1
          Wend
          If onaji = 0 Then
            Cells(1, 1).Value = Cells(1, 1).Value + 1
            gyou = (N + 1) * Cells(1, 1).Value - N
            For j1 = 1 To N
              For j2 = 1 To N
                Cells(gyou + j1 - 1, j2 + 1).Value = b(j1, j2)
              Next j2
            Next j1
          End If
        End If
      End If
      a(i) = a(i) + 1
    Wend
End Sub
Private Function f(ByVal x As Integer, ByVal i As Integer) As Integer
    If i = 0 Then
      f = (x - 1) \ N + 1
    Else
      f = ((x - 1) Mod N) + 1
    End If
End Function


◆東京都 明 さんからの解答

【問題1】

●□□●□
●□□□□
□●□□□
□□□□□
□□□□●
左上隅を起点として、小さな距離の順に石を置いて行きます。
石を置いたら等距離の位置のマスを除去して、次の石を置ける位置を決定します。
このとき既に置いてある石と等距離にない位置に石を置くように注意します。
このような方法で容易に解が見つかりました。

【問題2】

【問題1】と同様な方法では解にたどりつけず、プログラムで下記2種類の基本解を得ました。

No :  1 
□□□□□●
□□□□□□
□□□□□●
□□●□□□
●●□□□□
□□□□□●
No :  2 
□□□□□●
□□□□□●
●□□□□□
□□□□●□
□□□□□□
●□●□□□
【おまけ1】

プログラムにより、基本35種類を確認しました。
裏返し、回転を別ものとすれば280通りになります。

【おまけ2】

【問題2】の基本2種類。
裏返し、回転を別ものとすれば16通りになります。

なお、7×7のマス目で7個の石では基本解は次の1種類のみであることを確認しました。

No :  1 
□□□□□□●
□□□□□●□
□□□□□□□
●□□□□□□
□□□□□□●
□□●□□□□
●□●□□□□
8×8のマス目で8個の石ではプログラムの実行に時間がかかり過ぎ、完了ができませんでした。

石の配置の解が存在する限界を考察してみました。

N×Nのマス目でN個の石では、石の距離の数は N(N−1)
です。

一方マスの行・列数の違いで距離の種類を数えると N(N+1)
−1。

行・列数が違っても距離が同じものがあるのでこの数をDとすると、
マスの距離の種類は N(N+1)
−1−D。

従って、D≧Nでは石が配置できないことになります。

計算機でN=20まで確認しましたが
N≧16でD≧N、N≦15でD<Nです。

理論的にもN増加の割合よりもDの増加の割合が大きいことが証明できそうですので、
N≧16では解がないと予想できます。
(N=8も計算機のRUNの途中結果ですが、解がなさそうです。)

プログラムを参考で添付します。
(10進BASIC。同型を削除する仕掛けをしています。)


DECLARE EXTERNAL SUB zyun
DECLARE EXTERNAL SUB rever
DECLARE EXTERNAL SUB rotat

LET M=6
LET K=M*M
DIM N(K)
DIM NC(K)
DIM ND(K)
DIM NB(50,K)
DIM L((M-1)*M/2)
DIM X(M)
DIM Y(M)
LET COUNT=0

MAT N=ZER
FOR J=0 TO M-1
   LET N(K-J)=1
NEXT J

DO
   LET C=1
   LET R=0
   LET G=0
   FOR J=1 TO K
      IF N(J)=1 THEN
         LET X(C)=R
         LET Y(C)=G
         LET C=C+1
      END IF
      LET R=MOD(R+1,M)
      IF R=0 THEN LET G=G+1
   NEXT J
    
   CALL check
    
   IF P=1 THEN
      CALL paral
      IF P=1 THEN
         LET COUNT=COUNT+1
         CALL print
         FOR J=1 TO K
            LET NB(COUNT,J)=N(J)
         NEXT J
      END IF
   END IF
    
   CALL zyun(K,EX,N)
LOOP UNTIL EX=0
PRINT "総数 : ";COUNT
STOP

SUB print
   PRINT "No : ";COUNT
   LET R=0
   FOR J=1 TO K
      IF N(J)=1 THEN PRINT "●"; ELSE PRINT "□";
      LET R=MOD(R+1,M)
      IF R=0 THEN PRINT
   NEXT J
END SUB

SUB check
   LET P=0
   MAT L=ZER
   LET C=1
   FOR J=1 TO M-1
      FOR I=J+1 TO M
         LET B=(X(J)-X(I))^2+(Y(J)-Y(I))^2
         FOR H=1 TO C
            IF L(H)=B THEN EXIT SUB
         NEXT H
         LET L(C)=B
         LET C=C+1
      NEXT I
   NEXT J
   LET P=1
END SUB

SUB paral
   LET P=1
   IF COUNT=0 THEN EXIT SUB
   LET P=0
   FOR J=1 TO COUNT
      MAT ND=N
      FOR H=1 TO 3
         CALL rotat(M,ND,NC)
         LET CMP=1
         FOR I=1 TO K
            IF NB(J,I)<>NC(I) THEN 
               LET CMP=0            
               EXIT FOR
            END IF
         NEXT I
         IF CMP=1 THEN EXIT SUB
         MAT ND=NC
      NEXT H
      CALL rever(M,N,NC)
      LET CMP=1
      FOR I=1 TO K
         IF NB(J,I)<>NC(I) THEN 
            LET CMP=0            
            EXIT FOR
         END IF
      NEXT I
      IF CMP=1 THEN EXIT SUB
      MAT ND=NC
      FOR H=1 TO 3
         CALL rotat(M,ND,NC)
         LET CMP=1
         FOR I=1 TO K
            IF NB(J,I)<>NC(I) THEN 
               LET CMP=0            
               EXIT FOR
            END IF
         NEXT I
         IF CMP=1 THEN EXIT SUB
         MAT ND=NC
      NEXT H
   NEXT J
   LET P=1
END SUB   
 
END

!位置の回転
EXTERNAL SUB rotat(L,N(),M())
FOR X=0 TO L-1
   FOR Y=0 TO L-1
      LET XC=L-1-Y
      LET YC=X
      LET M(L*XC+YC+1)=N(L*X+Y+1)
   NEXT Y
NEXT X
END SUB

!左右反転
EXTERNAL SUB rever(L,N(),M())
FOR X=0 TO L-1
   FOR Y=0 TO L-1
      LET YC=L-1-Y
      LET M(L*X+YC+1)=N(L*X+Y+1)
   NEXT Y
NEXT X
END SUB

!順列の変更
EXTERNAL SUB zyun(K,EX,N())
DECLARE EXTERNAL SUB seiretu
LET EX=0
LET J=1
DO
   IF J>=K THEN EXIT DO
   IF N(K-J)<N(K-J+1) THEN
      CALL seiretu(J,K,N)
      LET L=1
      DO
         IF N(K-J)>=N(K-J+L) THEN 
            LET L=L+1
         ELSE
            LET B=N(K-J)
            LET N(K-J)=N(K-J+L)
            LET N(K-J+L)=B
            LET EX=1
            EXIT DO
         END IF
      LOOP
      EXIT DO
   ELSE 
      LET J=J+1          
   END IF
LOOP
END SUB

!配列の整列
EXTERNAL  SUB seiretu(J,K,N())
LET D=K-J+1
LET E=K
DO WHILE D<E
   LET B=N(D)
   LET N(D)=N(E)
   LET N(E)=B
   LET D=D+1
   LET E=E-1
LOOP
END SUB


◆愛知県 Y.M.Ojisan さんからの解答

【問題1】

等。

 左側解は上辺その他の2群にわけて考えたものであるが、カットアンドトライというべきものでここへの詳述には値しない。

【問題2】

これも左側解は上辺その他の2群にわけて考えたものである。

【おまけ】

PC探索による結果を表1に示す。
回転左右上下8対称で分類した数である。

なお、マスの巾数:N=9までは単純なシラミ潰しで探索し、
N=10〜15は表2の性質(Lの余裕が殆ど無い)を利用し、
外周探索範囲で一度ふるいを掛け、効率的に探索した。

表1 答え

マス巾数7は唯一解なので下記に示しておく。

マス巾数:N=8以上では存在しない。

∵ 少なくとも距離として N2種類が必要である。
マス上には距離として (N+2)*(N-1)
2
種の可能性があり、
N2を上回っている。

しかしNが大きくなると 
2+B2=C2+D2
の成立する組み合わせが N2の程度で存在するため、
N≧16では表2に示すように有効な距離の種類数L(N)が、を下回り、
N≧16では一般に存在しないといえる。

なお、例えば

(4p+3q)2+(3p−4q)2=(5p)2+(5q)2

が任意の整数p、qにおいて恒等的に成立することを利用して
2+B2=C2+D2
の成立する組み合わせがNの程度であることを証明できる。

表2 L(N)とN2

なお、N=15までの可否は表1に示したとおりである。

【PS】

明さんの解答から、最初の解答でL(N)の計算を間違っていることに気づき再計算&訂正しました。
さすがに前回のように数分では無理でしたが、最大数十分の計算時間で探索できました。
(CPU=500MHz)


 ◆ 問題へもどる

 ◆ 今週の問題

数学の部屋へもどる