八皇后问题

递归写法: 

# -*- coding:utf-8 -*-
import sys
import copy
global cnt
cnt = 0
def not_danger(i,j,chess):
	for ii in range(i):
		if chess[ii][j]==1:
			return 0
	ii,jj = i,j
	while (ii-1>=0 and jj-1>=0):
		ii-=1
		jj-=1
		if chess[ii][jj]==1:
			return 0
	ii,jj = i,j
	while (ii-1>=0 and jj+1<8):
		ii-=1
		jj+=1
		if chess[ii][jj]==1:
			return 0
	return 1

def queen(row,n,chess):
	new_chess = copy.deepcopy(chess)
	# print('queen/new_chess:',new_chess)
	if row==8:
		global cnt  #注意!此处cnt全局变量的写法
		cnt+=1
		print('第%d种解:'%cnt)
		for ii in range(8):
			print(new_chess[ii])
	else:
		for i in range(n):
			# print('i,j,not_danger:',row,i,not_danger(row,i,new_chess))
			if not_danger(row,i,new_chess):
				new_chess[row] = [0 for jj in range(n)]#注意!嵌套回溯找接下来可能的列数要把之前的标记位清空
				new_chess[row][i] = 1
				queen(row+1,n,new_chess)#注意!找到之后不能break,继续循环列数下去找其他可能的列值
				

a = [[0 for i in range(8)] for j in range(8)]
queen(0,8,a)

 1、全局变量

2、新建chess2变量存储每种可能的新棋盘

3、每次要把上一次找的列结果抹去,再找此行中的其他列结果

4、递归调用下一行后不能break退出,让程序递归调用查找此行中的其他可能的列

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值