私は再帰コーディングを学んでいて、自分自身のテストである 8 クイーン パズルを試しました。各ステップで競合があるかどうかを確認し、競合がある場合はバックトラックします。しかし、私のコードは時期尚早にバックトラックを停止しているようです。
まず、私は持っています:
0000
0000
0000
0000
次に、次のように変更されます。
1000
0000
0000
0000
その後、次のように変更されます。
1100
0000
0000
0000
これで、競合関数は True を返し、関数は停止します。なぜそれが呼び出さsolve_queen(grid)
れないのですか:
1010
0000
0000
0000
for
2 つのループに問題があると思いますが、どこで問題が発生したのsolve_queen(grid)
か正確にはわかりません。
私のコードは次のとおりです。
import copy
q4_zero = [[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]]
def format_failed(grid):
if len(grid) != len(grid[0]):
return True
elif len(grid) < 4:
return True
return False
def row_conflict(grid):
for row in grid:
if row.count(1) > 1:
return True
return False
def col_conflict(grid):
new_grid = [[r[col] for r in grid] for col in range(len(grid[0]))]
return row_conflict(grid)
def oblique_conflict(grid):
i_lst = []
j_lst = []
row_count = len(grid)
for i in xrange(row_count):
if grid[i].count(1) > 0:
j = grid[i].index(1)
i_lst.append(i)
j_lst.append(j)
for k in xrange(len(i_lst)):
for m in xrange(len(i_lst) - 1):
if abs(i_lst[m] - i_lst[m + 1]) == abs(j_lst[m] - j_lst[m + 1]):
return True
return False
def conflict(grid):
if format_failed(grid):
return True
elif row_conflict(grid):
return True
elif col_conflict(grid):
return True
elif oblique_conflict(grid):
return True
return False
def solve_queen(__grid):
res = conflict(__grid)
if res is True:
return res
grid = copy.deepcopy(__grid)
N = len(grid)
for i in xrange(N):
for j in xrange(N):
if grid[i][j] == 0:
grid[i][j] = 1
final_answer = solve_queen(grid)
if final_answer is not True:
return final_answer
return True
return grid
print solve_queen(q4_zero)