个人主页:丷从心
系列专栏:回溯法
Python
实现def symbol_triangle(n):
if (n * (n + 1) // 2) % 2:
return 0
half = n * (n + 1) // 4
count = 0 # 记录符合条件的符号三角形数量
# 初始化符号三角形矩阵
path = [[''] * n for _ in range(n)]
def backtrack(row, col, path, plus_count, minus_count):
nonlocal count
# 边界条件: 当列数等于 n 时, 表示已经生成了符号三角形的一种排列
if col == n:
if plus_count == minus_count:
count += 1
print(path)
return
# 尝试当前位置为 +
path[row][col] = '+'
plus_count += 1
# 更新符号三角形矩阵
cur_col = col
for i in range(1, cur_col + 1):
if path[i - 1][cur_col - 1] == path[i - 1][cur_col]:
path[i][cur_col - 1] = '+'
plus_count += 1
else:
path[i][cur_col - 1] = '-'
minus_count += 1
cur_col -= 1
# 检查是否满足条件, 继续生成下一行的符号
if plus_count <= half and minus_count <= half:
backtrack(row, col + 1, path, plus_count, minus_count)
# 恢复回溯之前状态
cur_col = col
for i in range(cur_col + 1):
if path[i][cur_col] == '+':
path[i][cur_col] = ''
plus_count -= 1
else:
path[i][cur_col] = ''
minus_count -= 1
cur_col -= 1
# 尝试当前位置为 -
path[row][col] = '-'
minus_count += 1
# 更新符号三角形矩阵
cur_col = col
for i in range(1, cur_col + 1):
if path[i - 1][cur_col - 1] == path[i - 1][cur_col]:
path[i][cur_col - 1] = '+'
plus_count += 1
else:
path[i][cur_col - 1] = '-'
minus_count += 1
cur_col -= 1
# 检查是否满足条件, 继续生成下一行的符号
if plus_count <= half and minus_count <= half:
backtrack(row, col + 1, path, plus_count, minus_count)
backtrack(0, 0, path, 0, 0)
return count
n = 4
print('满足条件的符号三角形如下:')
count = symbol_triangle(n)
print(f'符号三角形数量: {count}')
满足条件的符号三角形如下:
[['+', '+', '-', '+'], ['+', '-', '-', ''], ['-', '+', '', ''], ['-', '', '', '']]
[['+', '+', '-', '-'], ['+', '-', '+', ''], ['-', '-', '', ''], ['+', '', '', '']]
[['+', '-', '+', '+'], ['-', '-', '+', ''], ['+', '-', '', ''], ['-', '', '', '']]
[['+', '-', '+', '-'], ['-', '-', '-', ''], ['+', '+', '', ''], ['+', '', '', '']]
[['-', '+', '-', '+'], ['-', '-', '-', ''], ['+', '+', '', ''], ['+', '', '', '']]
[['-', '-', '+', '+'], ['+', '-', '+', ''], ['-', '-', '', ''], ['+', '', '', '']]
符号三角形数量: 6