八皇后问题--python代码

今天闲着无聊,正好用八皇后问题熟悉一下python的基本功。


#Queens -- 
def checkPlaceOK(queens, curPlace,maxrow):
	if len(queens)<=0:
		return True
	if ( curPlace[0]>=maxrow or curPlace[1]>=maxrow):
		return False
	for q in queens:
		if ( curPlace[0]==q[0] or curPlace[1]==q[1] ):
			return False
		if ( (q[1]-q[0])==(curPlace[1]-curPlace[0]) or q[0]+q[1]==curPlace[0]+curPlace[1]):
			return False
	return True



def findNxtQueenPlace(queens,startplace,maxrow):
	isok=False

	for i in range(startplace[0],maxrow):
		for j in range(startplace[1],maxrow):
			curPlace=(i,j)
			if checkPlaceOK(queens,curPlace,maxrow):
				isok=True;break;
		if isok:
			break
	if isok: ## if find the correct place, return the place
		return True,curPlace

	## else return false
	return False,(-1,-1)



def backToPreQueen(queens,maxrow):
	if len(queens)<=0:
		print "FATAL: NO resolution!!!"
		exit("FATAL: NO SOLUTION!!")
	lastqueen=queens[len(queens)-1]
	del queens[len(queens)-1]

	#print "TEst if removed item can be show:",lastqueen

	findPlace,place=findNxtQueenPlace(queens, (lastqueen[0],lastqueen[1]+1), maxrow)
	if findPlace:
		queens.append(place);return;		
	else:
		backToPreQueen(queens,maxrow)


queens=[]
MAXROW=8
iteration=0
while len(queens)<MAXROW:
	placeOK,place=findNxtQueenPlace(queens,(0,0),MAXROW)
	if placeOK:
		queens.append(place)
	else:
		backToPreQueen(queens,MAXROW)	

	print "iteration ",iteration,":",queens
	iteration+=1


print "Final result : ",queens

经过迭代438次,得到一个可行解

经过迭代

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值