PS:今天上午,非常郁闷,有很多简单基础的题问搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!
又是八皇后题问。
乎似每种语言中都会现出八皇后题问来诉告你递归算法怎么玩。
让我们先百度一下八皇后题问。于是你发现了百度百科,好长的词条,面里基本括包了有所主流语言的例程。让我们点击Python看一下。
我了个大槽,这是什么玩意,木有缩进,而且那个库也没见过,趁机搜一下。
像好是迭代器面里的西东。迭代器又是什么。 好吧,一个算法题问经已引出了一另个知识题问了。让我们先停在这里吧。去考参一另篇志日吧,还没写。><
我修复了面下上的序程。
from itertools import permutations for vec in permutations(range(8)): if (8 == len(set(vec[i]+i for i in range(8)))== len(set(vec[i]-i for i in range(8)))): print vec
显然是可以运行的。牛逼吧。
但是我们可以晓得,这面里是有重复的,因为从棋盘是对称的,每行辨别的法方不可避免的现出重复解。但这是确正的完全解92个。
这个序程对于我们初学者来讲太甚壮大了,不过它美完的现体了Python的美优。
让我们看一看比拟一般的设法。
像好直到现在我们还不晓得什么是八皇后题问,看一下哈。
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即意任两个皇后都不能处于统一行、统一列或统一斜线上,问有多少种摆法。
就是类似于这类布局。
如果我们在棋盘的的任何一个位置放一个皇后,
那么我们以可就失掉
这八个方向不能有另外的皇后了,根据这个景象,我们可以确定,一行有且只有一个皇后,每一列有且只有一个皇后。
我们先料想一个循环,对每一排的个每位置编号0~7 。
我们对每个位置都应该有可行性定判,即该位置的上下左右,正负对角线有没有皇后,如果有就跳过该位置。
这样的做法应该有几个数组来存保行列,正负对角线状态,让我们先定义全局变量,并且做一些初始化任务。
global col #定义一些全局变量 global row global pos_diag global nag_diag global count ''' =========================================================== ''' col = [] #阵矩列的列表,存储皇后地点列,若该列没有皇后,则响应置为1,反之则0 row = [] #阵矩行的列表,寄存每行皇后地点的列位置,随着序程的执行,在断不的变更中,之间输出结果 pos_diag = [] #正对角线,i-j恒定,-7~0~7,并且b(i)+7统一到0~14 nag_diag = [] #负对角线,i+j恒定,0~14 count = 0 for index in range(0, 8): #一些初始化任务 col.append(1) row.append(0) for index in range(0, 15): pos_diag.append(1) nag_diag.append(1)
这样,我们有了一张微观的表,诉告我们哪一行,哪一列,那几排对角线面上有皇后。
然后让我们定义定判序程。
def do_queen(i): ''' 生成有所确正解 @param i: 皇后的目数,即第几个皇后。从0数计 ''' for j in range(0, 8): #顺次试尝0~7位置 if col[j] == 1 and pos_diag[i-j+7] == 1 and nag_diag[i+j] == 1: #若该行,正对角线,负对角线上都没有皇后,则放入i皇后 row[i] = j col[j] = 0 #整调各个列表状态 pos_diag[i-j+7] = 0 nag_diag[i+j] = 0 if i < 7: do_queen(i+1) #可递增或减递 else: print row #发生一个结果,输出 col[j] = 1 #复恢各个列表状态为之前的 pos_diag[i-j+7] = 1 nag_diag[i+j] = 1
把这两段序程拼接起来就完成了,面下给出完全的算法。
global col #定义一些全局变量 global row global pos_diag global nag_diag global count def output(): ''' 输出一种有效结果 ''' global count print row count += 1 def do_queen(i): ''' 生成有所确正解 @param i: 皇后的目数 ''' for j in range(0, 8): #顺次试尝0~7位置 if col[j] == 1 and pos_diag[i-j+7] == 1 and nag_diag[i+j] == 1: #若该行,正对角线,负对角线上都没有皇后,则放入i皇后 row[i] = j col[j] = 0 #整调各个列表状态 pos_diag[i-j+7] = 0 nag_diag[i+j] = 0 if i < 7: do_queen(i+1) #可递增或减递 else: output() #发生一个结果,输出 col[j] = 1 #复恢各个列表状态为之前的 pos_diag[i-j+7] = 1 nag_diag[i+j] = 1 if __name__ == '__main__': col = [] #阵矩列的列表,存储皇后地点列,若该列没有皇后,则响应置为1,反之则0 row = [] #阵矩行的列表,寄存每行皇后地点的列位置,随着序程的执行,在断不的变更中,之间输出结果 pos_diag = [] #正对角线,i-j恒定,-7~0~7,并且b(i)+7统一到0~14 nag_diag = [] #负对角线,i+j恒定,0~14 count = 0 for index in range(0, 8): #一些初始化任务 col.append(1) row.append(0) for index in range(0, 15): pos_diag.append(1) nag_diag.append(1) do_queen(0) #开始递归,先放一个,顺次递增,反过来,从7开始减递也可 print 'Totally have %d solutions!' % count
文章结束给大家分享下程序员的一些笑话语录: 大家喝的是啤酒,这时你入座了。
你给自己倒了杯可乐,这叫低配置。
你给自已倒了杯啤酒,这叫标准配置。
你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。
你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。
你的同事给你倒了杯白酒,这叫推荐配置。
菜过三巡,你就不跟他们客气了。
你向对面的人敬酒,这叫p2p。
你向对面的人敬酒,他回敬你,你又再敬他……,这叫tcp。
你向一桌人挨个敬酒,这叫令牌环。
你说只要是兄弟就干了这杯,这叫广播。
有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。
你的小弟们过来敬你酒,这叫一对多。
你是boss,所有人过来敬你酒,这叫服务器。
酒是一样的,可是喝酒的人是不同的。
你越喝脸越红,这叫频繁分配释放资源。
你越喝脸越白,这叫资源不释放。
你已经醉了,却说我还能喝,叫做资源额度不足。
你明明能喝,却说我已经醉了,叫做资源保留。
喝酒喝到最后的结果都一样
你突然跑向厕所,这叫捕获异常。
你在厕所吐了,反而觉得状态不错,这叫清空内存。
你在台面上吐了,觉得很惭愧,这叫程序异常。
你在boss面前吐了,觉得很害怕,这叫系统崩溃。
你吐到了boss身上,只能索性晕倒了,这叫硬件休克。