| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 | import smtplibfrom email.mime.text import MIMETextfrom 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())
 |