Python----DFS---骑士周游问题

时间:2017-09-04 21:21:19   收藏:0   阅读:1813

这篇文章将会将一个数据结构与算法中一个很经典很重要的概念——深度优先搜索(Depth-First-Search:DFS)。。。。。。。。。(你他喵不是在标题里说了吗?)

好吧,DFS的精髓我其实也还没有弄的特别懂,估计得多用用才能理解更深吧。

!!!敲黑板!!!DFS的关键是递归,递归是真好用!!!

 


深度优先搜索(DFS)

什么是DFS呢,秉着能动手就绝不吵吵的原则,直接给出网上大神的博文链接:http://www.cnblogs.com/skywang12345/p/3711483.html

好吧,其实这种链接你自己都能百度到的。我就放这里做个参考,我的主要目的还是要讲一下骑士周游问题。

骑士周游问题

骑士周游问题的主要内容是什么呢?不是废话,直接上网址:http://blog.fishc.com/2554.html,这个页面对DFS问题说明的非常清楚。作者是小甲鱼大神,我在B站看的就是他的数据结构课程,不时的开个车差点闪了我的腰。

特喵的,不是说好的不说废话吗?(我错了,好吧)

好吧,直接上代码:

import datetime
from enum  import Enum

class Size(Enum):
    X = 8

start = datetime.datetime.now()
chess = [[0 for i in range(Size.X.value)]for j in range(Size.X.value)]

def nextXY(x, y, position):
    global chess
    if position==0 and x-2>=0 and y-1>=0 and chess[x-2][y-1]==0:
        return [1, x-2, y-1]
    elif position==1 and x-2>=0 and y+1<=Size.X.value-1 and chess[x-2][y+1]==0:
        return [1, x-2, y+1]
    elif position==2 and x-1>=0 and y-2>=0 and chess[x-1][y-2]==0:
        return [1, x-1, y-2]
    elif position==3 and x-1>=0 and y+2<=Size.X.value-1 and chess[x-1][y+2]==0:
        return [1, x-1, y+2]
    elif position==4 and x+1<=Size.X.value-1 and y-2>=0 and chess[x+1][y-2]==0:
        return [1, x+1, y-2]
    elif position==5 and x+1<=Size.X.value-1 and y+2<=Size.X.value-1 and chess[x+1][y+2]==0:
        return [1, x+1, y+2]
    elif position==6 and x+2<=Size.X.value-1 and y-1>=0 and chess[x+2][y-1]==0:
        return [1, x+2, y-1]
    elif position==7 and x+2<=Size.X.value-1 and y+1<=Size.X.value-1 and chess[x+2][y+1]==0:
        return [1, x+2, y+1]
    else:
        return [0, x, y]

def TravelChessBoard(x, y, tag):
    global chess
    chess[x][y] = tag
    if tag == Size.X.value**2:
        for i in chess:
            print(i)
        return "OK"
    f = 0
    for i in range(8):
        flag = nextXY(x, y, i)
        if flag[0]:
            statues = TravelChessBoard(flag[1], flag[2], tag+1)
            if statues=="OK":
                return "OK"
            f += 1
        else:
            f += 1
    if f == 8:
        chess[x][y] = 0


print(TravelChessBoard(2, 0, 1))
print(datetime.datetime.now() - start)

 

 整单代码一共可以分为三个部分:变量准备部分,位置判断部分,循环递归部分

1.变量准备部分:

2.位置判断部分:

 1 def TravelChessBoard(x, y, tag):
 2     global chess
 3     chess[x][y] = tag
 4     if tag == Size.X.value**2:
 5         for i in chess:
 6             print(i)
 7         return "OK"
 8     f = 0
 9     for i in range(8):
10         flag = nextXY(x, y, i)
11         if flag[0]:
12             statues = TravelChessBoard(flag[1], flag[2], tag+1)
13             if statues=="OK":
14                 return "OK"
15             f += 1
16         else:
17             f += 1
18     if f == 8:
19         chess[x][y] = 0

到此这个程序也差不多讲完了,我觉得只要理解递归了,这个程序应该不难理解。 


连续几天都在用递归,对递归的运用也越来越熟练,确实非常好用,真诚地希望这篇文章对你有帮助。

愿各位学业有成!!!

 

 

 

[1] 图拷贝自http://blog.fishc.com/2554.html,感谢鱼C工作室。

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!