八皇后 - 结果去重

去重后的结果,虽然显示两个,但是其实是等价的,主要就是对称性。如果继续去重,感觉可以将XY对调再去重。不再做调整了。


def TwinsQuickSort(datalist):
	if len(datalist)<=1:
		return datalist
	pivot=datalist[0]
	left=[];right=[];
	for i in range(len(datalist)):
		if i==0:
			continue;
		else:
			if datalist[i][0]<pivot[0]:				
				left.append(datalist[i])
			else:
				if datalist[i][0]>pivot[0]:
					right.append(datalist[i])
				else:
					if datalist[i][1]<pivot[1]:
						left.append(datalist[i])
					else:
						right.append(datalist[i])	
					
	return TwinsQuickSort(left) + [pivot] + TwinsQuickSort(right)

def QuickSort(datalist):
	if len(datalist)<=1:
		return datalist
	pivot=datalist[0]
	left=[];right=[];
	for i in range(len(datalist)):
		if i==0:
			continue;
		else:
			if datalist[i]<pivot:
				left.append(datalist[i])
			else:
				right.append(datalist[i])

	return QuickSort(left) + [pivot] + (QuickSort(right))





import sys,copy

#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
	i,j=startplace[0],startplace[1]
	while i<maxrow:
		while j<maxrow:
			if checkPlaceOK(queens,(i,j),maxrow):
				isok=True; break;
			else:
				j=j+1
		if isok:
			break
		else:
			i=i+1;j=0;

	if isok:
		return True,(i,j)		
	return False,(-1,-1)


def updateLastQueenPlace(queens,maxrow):
	exit=False
	if len(queens)<=0:
		print "Queen is empty, will exit"
		return


	lastqueen=queens[len(queens)-1]
	del queens[len(queens)-1]
	isok,place=findNxtQueenPlace(queens,(lastqueen[0],lastqueen[1]+1),maxrow)
	if isok:
		queens.append(place)
		return
	else:
		updateLastQueenPlace(queens,maxrow)


solutions=[]
queens=[(0,0)]
MAXROW=4
while(queens[0][0]<MAXROW):
	while len(queens)<MAXROW:
		if len(queens)<=0:
			break

		find,nxtPlace=findNxtQueenPlace(queens,(0,0),MAXROW)
		if find:
			queens.append(nxtPlace)
		else:
			updateLastQueenPlace(queens,MAXROW)

		if len(queens)>=MAXROW:	
			result=copy.deepcopy(queens)		 
			solutions.append(result) #Find one solution
			# find next solution
			del queens[len(queens)-1]
			updateLastQueenPlace(queens,MAXROW)

	if len(queens)<=0:
		break 

sortresult=[]
for i in range(len(solutions)):
	sortresult.append(str(TwinsQuickSort(solutions[i])))
	print "Solution ",i,": ",sortresult[i]

print sortresult

removeDup=set(sortresult)
print (list(removeDup))

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值