Python回溯法解符号三角形问题

以0表示加号,1表示减号

#! /usr/bin/env python
#coding=utf-8
#! /usr/bin/env python
#coding=utf-8
from __future__ import division

def Backtrack(depth):
    global numberOfTriangle,n,symbolTriangle,count#引用全局变量
    if count>(n*(n+1))/4:#count大于三角形中符号数的一半时,进行剪枝,因为显然此时不会得到符合条件的解了
        return
    if depth>=n: #到达叶子结点
        if count==n*(n+1)/4: #加号个数是符号总数的一半,即加号数=减号数时
            numberOfTriangle=numberOfTriangle+1
            print('triangles %s:' % numberOfTriangle) #打印出符合条件的三角形
            print symbolTriangle[0]
            print symbolTriangle[1]
            print symbolTriangle[2]
            return
        else:
            return
    for i in range(0,2): #左子树到右子树的遍历
        symbolTriangle[0][depth]=i #给第一层的第depth+1个结点赋值
        count=count+i
        for j in range(1,depth+1): #依据第一层可得到完整三角形
            symbolTriangle[j][depth-j]=symbolTriangle[j-1][depth-j]^symbolTriangle[j-1][depth-j+1]
            count=count+symbolTriangle[j][depth-j]
        Backtrack(depth+1)#进入下个结点
        for j in range(1,depth+1): #从上个结点退出时需要对count作减法运算
            count=count-symbolTriangle[j][depth-j]
        count=count-i

def main():
    global symbolTriangle,n,numberOfTriangle,count#全局变量,分别表示符号三角形,符号三角形第一层的符号数,符合条件的三角形个数,符号三角形中的加号个数
    symbolTriangle=[]
    n=3
    numberOfTriangle=0
    count=0 #开始时加号个数为0
    for i in range(0,n): #初始化符号三角形
        symbolTriangle.append([])
        for j in range(0,n-i):
            symbolTriangle[i].append(1)
    Backtrack(0) #进入回溯
    print('numbeOfTriangle:%s' % numberOfTriangle)#打印出符合条件的三角形个数

main()

你可能感兴趣的:(算法,python,算法,回溯法,符号三角形)