八皇后-优化冲突检测

上一版程序当中,通过检查全部棋盘来判断冲突,效率低下,代码冗长,而且容易出错。

参考书上的代码,判断冲突的时候,只需要针对已经摆好的皇后和本次摆放的皇后挨个比较:

如果两者,在横轴(列)的数据之差等于0,则说明在同一列,如果等于两者在纵轴(行)之差,则说明在对角线上。


至于是否在同一行上面,代码在逻辑上进行了处理,如果一行摆了皇后,则往下一行再摆,从而避免了在同一行。


优化后的代码,简洁明快,令人拍案叫绝。而且效率是全比较的10倍!!!!


#encoding:utf-8
import copy

def initBorad():
	board=[];
	for _ in range(8):
		x=map( lambda x:x-x,range(8) )
		board.append(x)
	return board

def checkAttackX(lx,ij):
	for x in lx:
		if abs(ij[1]-x[1]) in (0,abs(ij[0]-x[0])):
			return True;
	return False;




def eightQueen():
	board=initBorad()
	allBoard=[]
	stack=[]
	i=j=0
	try:
		while True:
			while  i < len(board):
				found=False
				while j < len(board):
					board[i][j]=1
					if (checkAttackX(stack,(i,j))==True):
						board[i][j]=0
						j+=1
					else:
						stack.append((i,j))
						found=True
						i+=1
						j=0
						break
				if found==False:
					i,j=stack.pop()
					board[i][j]=0
					j+=1
			allBoard.append(board)
			board=copy.deepcopy(board)
			i,j=stack.pop()
			board[i][j]=0
			j+=1
	except (Exception) as e:
		print "八皇后摆放完毕"
		return allBoard

x=eightQueen()
count=0
for ie in x:
	count+=1
	print "\n解法:"+str(count)
	for ii in ie:
		print ii


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值