クラフトフェア松本2018(56)






d0108132_11220026.jpg









-------------


先日の「数独」に引き続き、今日は「区割り」パズルをラスベリーパイのPythonで解くことに挑戦。
問題:
4人が6x6の正方形の土地を同じ形に分割したい(例えば全員3x3の正方形とか)。ただし、土地は上下左右でつながっていること(飛び地はダメ)と、赤と緑の土地は全員がひとつずつ欲しい(水場とか囲炉裏でもいいんですが)。どうやって区割りをすればいいでしょうか。
ちなみに、同じ形4つに分割する方法は45通りあります。そのうちひとつが、上の条件を満たします。
d0108132_10360724.png







import numpy as np

# 初期状態
q = np.zeros([7, 7], dtype=int)
q[ 1, 1] = 1
q[ 1, 6] = 2
q[ 6, 6] = 3
q[ 6, 1] = 4
red = np.zeros([7, 7], dtype=int)
red[6, 1] = red[3, 4] = red[3 ,6] = red[4, 6] = 1
green = np.zeros([7, 7], dtype=int)
green[3, 1] = green[5, 1] = green [5 ,4] = green [5, 5] = 1


def conq(pos, r, level):
   if level > 8 :
#      print r[1:8,1:8], "complete";
      if (1 in red*r) and (2 in red*r) and (3 in red*r) and (4 in red*r) and (1 in green*r) and (2 in green*r) and (3 in green*r) and (4 in green*r) :
         print r[1:8,1:8], "success"
      return
   if pos > 35 : return      for x in range (pos, 36):
      if r[x//6+1, x%6+1] == 0:
         if r[x//6+1, x%6+1 - 1] == 1 or r[x//6+1 - 1, x%6+1] == 1:
            r[x//6+1, x%6+1] = 1
            r[x%6+1, 5 - x//6+1] = 2      
            r[5 - x//6+1, 5 - x%6+1] = 3
            r[5 - x%6+1, x//6+1] = 4
            conq(x+1, r, level+1)
            r[x//6+1, x%6+1] = 0
            r[x%6+1, 5 - x//6+1] = 0      
            r[5 - x//6+1, 5 - x%6+1] = 0
            r[5 - x%6+1, x//6+1] = 0
   conq(x+1, r, level)   


conq(1, q, 1)

.

[PR]

by tullyz1 | 2018-09-28 16:22 | Comments(4)

Commented by minton at 2018-09-28 20:51 x
人が入った写真ていいなあと思います。
ノクチだからこんなに柔らかいんでしょうかねえ。
Commented by roxanne6 at 2018-09-28 21:47
いかにもクラフト好みなおねーさんです^^
Commented by tullyz1 at 2018-09-28 22:14
>mintonさん
クラフトを撮りに行ったはずなんですが、興味の先は人に移っていますね^^
ノクチに助けられている写真ですよね。まあ実力もないので、ノクチの助けも必要です^^;
Commented by tullyz1 at 2018-09-28 22:15
>roxanne6さん
スタイルが典型的なクラフト女子ですよね^^ 他の場所ではこういう女性は見かけません^^
名前
URL
削除用パスワード

<< クラフトフェア松本2018(57) クラフトフェア松本2018(55) >>