行、列、および対角線の合計が15である3x3行列Mを検索します。条件:1-9のすべての数を使用する必要があります。この行列パズルを解くより効率的な解法はありますか?
は、私は非常に巧妙ではないので、私はちょうどこの強引な方法を試してみました:
def solve_999():
for a in range(1, 10):
for b in range(1, 10):
for c in range(1, 10):
for d in range(1, 10):
for e in range(1, 10):
for f in range(1, 10):
for g in range(1, 10):
for h in range(1, 10):
for i in range(1, 10):
if (a+b+c == d+e+f == g+h+i == a+d+g == b+e+h == c+f+i == a+e+i == c+e+g == 15):
if check_unique([a, b, c, d, e, f, g, h, i]):
print(a, b, c)
print(d, e, f)
print(g, h, i)
return
def check_unique(L):
d = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0}
for letter in L:
d[letter] += 1
if d[letter] > 1:
return False
return True
それは動作しますが、それは非常に効率的ではありません。誰も私がより効率的なソリューションを見つけるのを助けることができますか?
'b'ループでは、' a'の現在の値をスキップできます。 'c'ループでは、' a'と 'b'の現在の値をスキップします。等々。これにより、内部の反復がずっと小さくなり、 'check_unique'を使う必要はありません。 – Barmar
問題1は、if(a + b + c == d + e + f == g + h + i == a + d + g == b + e + h == c + f + i = = a + e + i == c + e + g == 9): '== 15'にする必要があります。 –