回溯算法-八皇后【数据结构与算法笔记1】

注:2019-09-07,新生报到,忙着给移动推销卡。这几天头大… 自学完链表,跳到了栈,其中的回溯算法,一开始感觉不怎么难,后面真正实现的时候再一次体会到,理论跟实践的区别。

1 python 实现

暂时先用python,cpp/c还在学,也是借鉴其他博客的代码。

queen_list = [None]*8
maxn = 8
total = 0
def show():
    global total 
    total +=1
    for i in range(maxn):
    	print("({}-{})".format(i, quen_list[i]))
    
def check(current_row):     //    检查皇后位置是否与前面皇后位置重合或者在对角线上
    data = queen_list[current_row]
    for prev_row in range(current_row):
        if (queen_list[prev_row] == data) or (abs(queen_list[prev_row]-queen_list[current_row])== current_row- prev_row):
            return False
    return True

def fuck_queens(current_row): //重点1,current_row
    for value in range(maxn):   // 重点2,对当前current_row行,遍历所有的可能值
        queen_list[current_row] = value  
        if check(current_row):
            if current_row == maxn -1:
                show()
            else:
                fuck_queens(current_row+1)  // 这个点太**重要,一定要理解,不论怎么样,这个小的fuck_queens都在母函数大fuck_queens的for value in range(maxn) 循环里面,直到循环至第八行为止

为了方便理解,我贴出输出来解读

(0-0)(1-4)(2-7)(3-5)(4-2)(5-6)(6-1)(7-3)第1种解法
(0-0)(1-5)(2-7)(3-2)(4-6)(5-3)(6-1)(7-4)第2种解法
(0-0)(1-6)(2-3)(3-5)(4-7)(5-1)(6-4)(7-2)第3种解法
(0-0)(1-6)(2-4)(3-7)(4-1)(5-3)(6-5)(7-2)第4种解法
(0-1)(1-3)(2-5)(3-7)(4-2)(5-0)(6-6)(7-4)第5种解法
(0-1)(1-4)(2-6)(3-0)(4-2)(5-7)(6-5)(7-3)第6种解法
(0-1)(1-4)(2-6)(3-3)(4-0)(5-7)(6-5)(7-2)第7种解法
(0-1)(1-5)(2-0)(3-6)(4-3)(5-7)(6-2)(7-4)第8种解法
(0-1)(1-5)(2-7)(3-2)(4-0)(5-3)(6-6)(7-4)第9种解法
(0-1)(1-6)(2-2)(3-5)(4-7)(5-4)(6-0)(7-3)第10种解法
(0-1)(1-6)(2-4)(3-7)(4-0)(5-3)(6-5)(7-2)第11种解法
(0-1)(1-7)(2-5)(3-0)(4-2)(5-4)(6-6)(7-3)第12种解法
(0-2)(1-0)(2-6)(3-4)(4-7)(5-1)(6-3)(7-5)第13种解法
(0-2)(1-4)(2-1)(3-7)(4-0)(5-6)(6-3)(7-5)第14种解法
(0-2)(1-4)(2-1)(3-7)(4-5)(5-3)(6-6)(7-0)第15种解法
(0-2)(1-4)(2-6)(3-0)(4-3)(5-1)(6-7)(7-5)第16种解法
(0-2)(1-4)(2-7)(3-3)(4-0)(5-6)(6-1)(7-5)第17种解法
(0-2)(1-5)(2-1)(3-4)(4-7)(5-0)(6-6)(7-3)第18种解法
(0-2)(1-5)(2-1)(3-6)(4-0)(5-3)(6-7)(7-4)第19种解法
(0-2)(1-5)(2-1)(3-6)(4-4)(5-0)(6-7)(7-3)第20种解法
(0-2)(1-5)(2-3)(3-0)(4-7)(5-4)(6-6)(7-1)第21种解法
(0-2)(1-5)(2-3)(3-1)(4-7)(5-4)(6-6)(7-0)第22种解法
(0-2)(1-5)(2-7)(3-0)(4-3)(5-6)(6-4)(7-1)第23种解法
(0-2)(1-5)(2-7)(3-0)(4-4)(5-6)(6-1)(7-3)第24种解法
(0-2)(1-5)(2-7)(3-1)(4-3)(5-0)(6-6)(7-4)第25种解法
(0-2)(1-6)(2-1)(3-7)(4-4)(5-0)(6-3)(7-5)第26种解法
(0-2)(1-6)(2-1)(3-7)(4-5)(5-3)(6-0)(7-4)第27种解法
(0-2)(1-7)(2-3)(3-6)(4-0)(5-5)(6-1)(7-4)第28种解法
(0-3)(1-0)(2-4)(3-7)(4-1)(5-6)(6-2)(7-5)第29种解法
(0-3)(1-0)(2-4)(3-7)(4-5)(5-2)(6-6)(7-1)第30种解法
(0-3)(1-1)(2-4)(3-7)(4-5)(5-0)(6-2)(7-6)第31种解法
(0-3)(1-1)(2-6)(3-2)(4-5)(5-7)(6-0)(7-4)第32种解法
(0-3)(1-1)(2-6)(3-2)(4-5)(5-7)(6-4)(7-0)第33种解法
(0-3)(1-1)(2-6)(3-4)(4-0)(5-7)(6-5)(7-2)第34种解法
(0-3)(1-1)(2-7)(3-4)(4-6)(5-0)(6-2)(7-5)第35种解法
(0-3)(1-1)(2-7)(3-5)(4-0)(5-2)(6-4)(7-6)第36种解法
(0-3)(1-5)(2-0)(3-4)(4-1)(5-7)(6-2)(7-6)第37种解法
(0-3)(1-5)(2-7)(3-1)(4-6)(5-0)(6-2)(7-4)第38种解法
(0-3)(1-5)(2-7)(3-2)(4-0)(5-6)(6-4)(7-1)第39种解法
(0-3)(1-6)(2-0)(3-7)(4-4)(5-1)(6-5)(7-2)第40种解法
(0-3)(1-6)(2-2)(3-7)(4-1)(5-4)(6-0)(7-5)第41种解法
(0-3)(1-6)(2-4)(3-1)(4-5)(5-0)(6-2)(7-7)第42种解法
(0-3)(1-6)(2-4)(3-2)(4-0)(5-5)(6-7)(7-1)第43种解法
(0-3)(1-7)(2-0)(3-2)(4-5)(5-1)(6-6)(7-4)第44种解法
(0-3)(1-7)(2-0)(3-4)(4-6)(5-1)(6-5)(7-2)第45种解法
(0-3)(1-7)(2-4)(3-2)(4-0)(5-6)(6-1)(7-5)第46种解法
(0-4)(1-0)(2-3)(3-5)(4-7)(5-1)(6-6)(7-2)第47种解法
(0-4)(1-0)(2-7)(3-3)(4-1)(5-6)(6-2)(7-5)第48种解法
(0-4)(1-0)(2-7)(3-5)(4-2)(5-6)(6-1)(7-3)第49种解法
(0-4)(1-1)(2-3)(3-5)(4-7)(5-2)(6-0)(7-6)第50种解法
(0-4)(1-1)(2-3)(3-6)(4-2)(5-7)(6-5)(7-0)第51种解法
(0-4)(1-1)(2-5)(3-0)(4-6)(5-3)(6-7)(7-2)第52种解法
(0-4)(1-1)(2-7)(3-0)(4-3)(5-6)(6-2)(7-5)第53种解法
(0-4)(1-2)(2-0)(3-5)(4-7)(5-1)(6-3)(7-6)第54种解法
(0-4)(1-2)(2-0)(3-6)(4-1)(5-7)(6-5)(7-3)第55种解法
(0-4)(1-2)(2-7)(3-3)(4-6)(5-0)(6-5)(7-1)第56种解法
(0-4)(1-6)(2-0)(3-2)(4-7)(5-5)(6-3)(7-1)第57种解法
(0-4)(1-6)(2-0)(3-3)(4-1)(5-7)(6-5)(7-2)第58种解法
(0-4)(1-6)(2-1)(3-3)(4-7)(5-0)(6-2)(7-5)第59种解法
(0-4)(1-6)(2-1)(3-5)(4-2)(5-0)(6-3)(7-7)第60种解法
(0-4)(1-6)(2-1)(3-5)(4-2)(5-0)(6-7)(7-3)第61种解法
(0-4)(1-6)(2-3)(3-0)(4-2)(5-7)(6-5)(7-1)第62种解法
(0-4)(1-7)(2-3)(3-0)(4-2)(5-5)(6-1)(7-6)第63种解法
(0-4)(1-7)(2-3)(3-0)(4-6)(5-1)(6-5)(7-2)第64种解法
(0-5)(1-0)(2-4)(3-1)(4-7)(5-2)(6-6)(7-3)第65种解法
(0-5)(1-1)(2-6)(3-0)(4-2)(5-4)(6-7)(7-3)第66种解法
(0-5)(1-1)(2-6)(3-0)(4-3)(5-7)(6-4)(7-2)第67种解法
(0-5)(1-2)(2-0)(3-6)(4-4)(5-7)(6-1)(7-3)第68种解法
(0-5)(1-2)(2-0)(3-7)(4-3)(5-1)(6-6)(7-4)第69种解法
(0-5)(1-2)(2-0)(3-7)(4-4)(5-1)(6-3)(7-6)第70种解法
(0-5)(1-2)(2-4)(3-6)(4-0)(5-3)(6-1)(7-7)第71种解法
(0-5)(1-2)(2-4)(3-7)(4-0)(5-3)(6-1)(7-6)第72种解法
(0-5)(1-2)(2-6)(3-1)(4-3)(5-7)(6-0)(7-4)第73种解法
(0-5)(1-2)(2-6)(3-1)(4-7)(5-4)(6-0)(7-3)第74种解法
(0-5)(1-2)(2-6)(3-3)(4-0)(5-7)(6-1)(7-4)第75种解法
(0-5)(1-3)(2-0)(3-4)(4-7)(5-1)(6-6)(7-2)第76种解法
(0-5)(1-3)(2-1)(3-7)(4-4)(5-6)(6-0)(7-2)第77种解法
(0-5)(1-3)(2-6)(3-0)(4-2)(5-4)(6-1)(7-7)第78种解法
(0-5)(1-3)(2-6)(3-0)(4-7)(5-1)(6-4)(7-2)第79种解法
(0-5)(1-7)(2-1)(3-3)(4-0)(5-6)(6-4)(7-2)第80种解法
(0-6)(1-0)(2-2)(3-7)(4-5)(5-3)(6-1)(7-4)第81种解法
(0-6)(1-1)(2-3)(3-0)(4-7)(5-4)(6-2)(7-5)第82种解法
(0-6)(1-1)(2-5)(3-2)(4-0)(5-3)(6-7)(7-4)第83种解法
(0-6)(1-2)(2-0)(3-5)(4-7)(5-4)(6-1)(7-3)第84种解法
(0-6)(1-2)(2-7)(3-1)(4-4)(5-0)(6-5)(7-3)第85种解法
(0-6)(1-3)(2-1)(3-4)(4-7)(5-0)(6-2)(7-5)第86种解法
(0-6)(1-3)(2-1)(3-7)(4-5)(5-0)(6-2)(7-4)第87种解法
(0-6)(1-4)(2-2)(3-0)(4-5)(5-7)(6-1)(7-3)第88种解法
(0-7)(1-1)(2-3)(3-0)(4-6)(5-4)(6-2)(7-5)第89种解法
(0-7)(1-1)(2-4)(3-2)(4-0)(5-6)(6-3)(7-5)第90种解法
(0-7)(1-2)(2-0)(3-5)(4-1)(5-4)(6-6)(7-3)第91种解法
(0-7)(1-3)(2-0)(3-2)(4-5)(5-1)(6-6)(7-4)第92种解法

注意 第一行,他严格的按照了循环的1,2,3,4,5 … 后面的行就显得非常杂乱,这遍体现了试错回溯的思想,其实仔细看某一列相同几行,你就会发现,这几行的后一列的值,都是递增的
为什么? 因为上一层的fucck_queen循环都还没有完成,最极端的例子就是 最上层的fuck_queens,直到最上层的循环完成,那么所有的解也就找到了

一定要注意,这就是个遍历!!!,只不过它觉得希望渺茫的时候不会再进行下去,返回上一轮再寻找别的路径,所以真正的遍历应该是8的8次方,然而这里的解法 循环次数一定比其小得多!!!

真正的遍历,茂密并且高度相同的树林; 回溯,高矮参差不齐,数量‘稀少’,树根直接被砍

这是我目前的想法,等我学完cpp之后,再来写c/cpp的版本。虽然现在也能写,但感觉不太妥 ):

发布了48 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/NewDreamstyle/article/details/100593419