|  | @@ -0,0 +1,208 @@
 | 
	
		
			
				|  |  | +import smtplib
 | 
	
		
			
				|  |  | +from email.mime.text import MIMEText
 | 
	
		
			
				|  |  | +from email.header import Header
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +"""
 | 
	
		
			
				|  |  | +    回溯算法(试探法)
 | 
	
		
			
				|  |  | +    在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    回溯算法解决问题的
 | 
	
		
			
				|  |  | +    针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。
 | 
	
		
			
				|  |  | +    确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。
 | 
	
		
			
				|  |  | +    以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
 | 
	
		
			
				|  |  | +"""
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class StockTest(object):
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +        栈练习
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def queen(self, A, cur=0):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            八皇后问题
 | 
	
		
			
				|  |  | +        :param A:
 | 
	
		
			
				|  |  | +        :param cur:
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        if cur == len(A):
 | 
	
		
			
				|  |  | +            print(A)
 | 
	
		
			
				|  |  | +            # return 0
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            for col in range(len(A)):
 | 
	
		
			
				|  |  | +                A[cur], flag = col, True
 | 
	
		
			
				|  |  | +                # 判断当前与之前的所有是否规则冲突
 | 
	
		
			
				|  |  | +                for row in range(cur):
 | 
	
		
			
				|  |  | +                    if A[row] == col or abs(col - A[row]) == cur - row:
 | 
	
		
			
				|  |  | +                        flag = False
 | 
	
		
			
				|  |  | +                        break
 | 
	
		
			
				|  |  | +                if flag:
 | 
	
		
			
				|  |  | +                    self.queen(A, cur + 1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def movingCount(self, threshold, rows, cols):
 | 
	
		
			
				|  |  | +        "产生 0 矩阵 "
 | 
	
		
			
				|  |  | +        board = [[0 for i in range(cols)] for j in range(rows)]
 | 
	
		
			
				|  |  | +        global acc
 | 
	
		
			
				|  |  | +        acc = 0
 | 
	
		
			
				|  |  | +        "下标之和,若大于threshold则TRUE,否则Folse"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        def block(r, c):
 | 
	
		
			
				|  |  | +            s = sum(map(int, str(r) + str(c)))
 | 
	
		
			
				|  |  | +            return s > threshold
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        def traverse(r, c):
 | 
	
		
			
				|  |  | +            global acc
 | 
	
		
			
				|  |  | +            if not (0 <= r < rows and 0 <= c < cols):  # 超出角标范围挑出
 | 
	
		
			
				|  |  | +                return
 | 
	
		
			
				|  |  | +            if board[r][c] != 0:  # 不等于0 跳出
 | 
	
		
			
				|  |  | +                return
 | 
	
		
			
				|  |  | +            if board[r][c] == -1 or block(r, c):
 | 
	
		
			
				|  |  | +                board[r][c] = -1  # 超出门限的点记录-1
 | 
	
		
			
				|  |  | +                return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            board[r][c] = 1  # 符合规定的点记录1,并计数加一
 | 
	
		
			
				|  |  | +            acc += 1
 | 
	
		
			
				|  |  | +            traverse(r + 1, c)
 | 
	
		
			
				|  |  | +            traverse(r - 1, c)
 | 
	
		
			
				|  |  | +            traverse(r, c + 1)
 | 
	
		
			
				|  |  | +            traverse(r, c - 1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        traverse(0, 0)
 | 
	
		
			
				|  |  | +        return acc
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def bubble_sort(self, numbers):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            时间复杂度:O(n^2)
 | 
	
		
			
				|  |  | +        :param numbers:
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        n = len(numbers)
 | 
	
		
			
				|  |  | +        for i in range(n):
 | 
	
		
			
				|  |  | +            for j in range(0, n - i - 1):
 | 
	
		
			
				|  |  | +                if numbers[j] > numbers[j + 1]:
 | 
	
		
			
				|  |  | +                    numbers[j], numbers[j + 1] = numbers[j + 1], numbers[j]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return numbers
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def choose_sort(self, numbers):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            选择排序,时间复杂度O(n^2)
 | 
	
		
			
				|  |  | +        :param numbers:
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        n = len(numbers)
 | 
	
		
			
				|  |  | +        for i in range(n):
 | 
	
		
			
				|  |  | +            min_index = i
 | 
	
		
			
				|  |  | +            min_value = numbers[i]
 | 
	
		
			
				|  |  | +            for j in range(i + 1, n):
 | 
	
		
			
				|  |  | +                if min_value > numbers[j]:
 | 
	
		
			
				|  |  | +                    min_value = numbers[j]
 | 
	
		
			
				|  |  | +                    min_index = j
 | 
	
		
			
				|  |  | +            if min_index != i:
 | 
	
		
			
				|  |  | +                numbers[min_index] = numbers[i]
 | 
	
		
			
				|  |  | +                numbers[i] = min_value
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return numbers
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def insert_sort(self, numbers):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            插入排序,时间复杂度O(n^2)
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        n = len(numbers)
 | 
	
		
			
				|  |  | +        for i in range(1, n):
 | 
	
		
			
				|  |  | +            insert_index = i - 1
 | 
	
		
			
				|  |  | +            insert_value = numbers[i]
 | 
	
		
			
				|  |  | +            while insert_index >= 0 and insert_value < numbers[insert_index]:
 | 
	
		
			
				|  |  | +                numbers[insert_index + 1] = numbers[insert_index]
 | 
	
		
			
				|  |  | +                insert_index -= 1
 | 
	
		
			
				|  |  | +            if insert_index + 1 != i:
 | 
	
		
			
				|  |  | +                numbers[insert_index + 1] = insert_value
 | 
	
		
			
				|  |  | +        return numbers
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def shell_sort(self, numbers):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            希尔排序,时间复杂度O(n^2)
 | 
	
		
			
				|  |  | +        :param numbers:
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        n = len(numbers)
 | 
	
		
			
				|  |  | +        gap = int(n / 2)
 | 
	
		
			
				|  |  | +        while gap > 0:
 | 
	
		
			
				|  |  | +            for i in range(gap, n):
 | 
	
		
			
				|  |  | +                temp = numbers[i]
 | 
	
		
			
				|  |  | +                j = i
 | 
	
		
			
				|  |  | +                while j >= gap and numbers[j - gap] > temp:
 | 
	
		
			
				|  |  | +                    numbers[j] = numbers[j - gap]
 | 
	
		
			
				|  |  | +                    j -= gap
 | 
	
		
			
				|  |  | +                numbers[i] = temp
 | 
	
		
			
				|  |  | +            gap = int(gap / 2)
 | 
	
		
			
				|  |  | +        return numbers
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def quick_sort(self, numbers):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            快速排序,时间复杂度O(n^2)
 | 
	
		
			
				|  |  | +        :param numbers:
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        if len(numbers) <= 1:
 | 
	
		
			
				|  |  | +            return numbers
 | 
	
		
			
				|  |  | +        pivot = numbers[int(len(numbers) / 2)]
 | 
	
		
			
				|  |  | +        left = [x for x in numbers if x < pivot]
 | 
	
		
			
				|  |  | +        middle = [pivot]
 | 
	
		
			
				|  |  | +        right = [x for x in numbers if x > pivot]
 | 
	
		
			
				|  |  | +        return self.quick_sort(left) + middle + self.quick_sort(right)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def merge_sort(self, numbers):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            归并排序
 | 
	
		
			
				|  |  | +        :param numbers:
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def radix_sort(self, numbers):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            基数排序,时间复杂度O(n*k)
 | 
	
		
			
				|  |  | +        :param number:
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        # 记录当前正在排拿一位,最低位为1
 | 
	
		
			
				|  |  | +        i = 0
 | 
	
		
			
				|  |  | +        max_num = max(numbers)
 | 
	
		
			
				|  |  | +        # 记录最大值的位数
 | 
	
		
			
				|  |  | +        j = len(str(max_num))
 | 
	
		
			
				|  |  | +        while i < j:
 | 
	
		
			
				|  |  | +            # 初始化桶数组
 | 
	
		
			
				|  |  | +            bucket_list = [[] for _ in range(10)]
 | 
	
		
			
				|  |  | +            for x in numbers:
 | 
	
		
			
				|  |  | +                # 找到位置放入桶数组
 | 
	
		
			
				|  |  | +                bucket_list[int(x / (10 ** i)) % 10].append(x)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            numbers.clear()
 | 
	
		
			
				|  |  | +            # 放回原序列
 | 
	
		
			
				|  |  | +            for x in bucket_list:
 | 
	
		
			
				|  |  | +                numbers.extend([a for a in x])
 | 
	
		
			
				|  |  | +            i += 1
 | 
	
		
			
				|  |  | +        return numbers
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def send_mail(self):
 | 
	
		
			
				|  |  | +        sender = '1285211525@qq.com'
 | 
	
		
			
				|  |  | +        receivers = '1285211525@qq.com'
 | 
	
		
			
				|  |  | +        message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
 | 
	
		
			
				|  |  | +        message['From'] = Header('binren')
 | 
	
		
			
				|  |  | +        message['To'] = Header('zhangbr')
 | 
	
		
			
				|  |  | +        subject = 'test mail'
 | 
	
		
			
				|  |  | +        message['Subject'] = Header(subject, 'utf-8')
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            stmp_obj = smtplib.SMTP('localhost')
 | 
	
		
			
				|  |  | +            stmp_obj.sendmail(sender, receivers, message.as_string())
 | 
	
		
			
				|  |  | +            print('send successful')
 | 
	
		
			
				|  |  | +        except Exception as e:
 | 
	
		
			
				|  |  | +            print(e)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +if __name__ == '__main__':
 | 
	
		
			
				|  |  | +    st = StockTest()
 | 
	
		
			
				|  |  | +    nums = [1, 2, 5, 3, 1, 101, 10, 1111, 2]
 | 
	
		
			
				|  |  | +    print(st.send_mail())
 |