转自:http://blog.csdn.net/justme0/article/details/7540425
背景介绍:
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。而且仅当 n = 1 或 n ≥ 4 时问题有解。
摘自百度百科
1、介绍
2、程序
看着严蔚敏的书写的,写好后运行一次性成功了,程序如下:
运行结果:
3、数学问题
关于n皇后的解的个数(8皇后是92个解):
独立解的问题我就不多提了。目前这个数列还没找到通项公式。有意思的是,高斯算八皇后的解的个数时,他算错了,他的答案是76种,不知道他漏了哪种,呵呵。(不过也是4的倍数)
4、想法
那个Trial递归函数我还没弄明白,对着书抄的,要是自己想,难。还有待研究推广。
2012/5/8 更新
把判断是否合法的IsLegal函数优化了,原来的程序是O(N^3),现在是 O(N^2):
2012/5/12更新:
推荐:http://topic.csdn.net/t/20060424/13/4709025.html
我在自己机子上运行了下:
5、python实现
N = 8
case_cnt = 0
pos_list = [0] * N
def eight_queen(number):
global N
N = number
global case_cnt
case_cnt = 0
global pos_list
pos_list = [0] * number
deal_deploy(0)
print('%d ------> %d\n' % (number, case_cnt))
def deal_deploy(row):
if row >= N:
deal_print()
else:
for cl in range(N):
pos_list[row] = cl
if not conflict(row, cl):
deal_deploy(row + 1)
pos_list[row] = 0
def deal_print():
global case_cnt
case_cnt += 1
str = 'case %d:\n' % case_cnt
for i in range(N):
str += ' . ' * (pos_list[i]) + ' # ' + ' . ' * (N - pos_list[i] - 1) + '\n'
print(str)
def conflict(row, cl):
for r in range(row):
c = pos_list[r]
if cl == c or abs(row - r) == abs(cl - c):
return True
return False
eight_queen(6)
##for i in range(1, 11):
## eight_queen(i)
输出:
case 1:
. # . . . .
. . . # . .
. . . . . #
# . . . . .
. . # . . .
. . . . # .
case 2:
. . # . . .
. . . . . #
. # . . . .
. . . . # .
# . . . . .
. . . # . .
case 3:
. . . # . .
# . . . . .
. . . . # .
. # . . . .
. . . . . #
. . # . . .
case 4:
. . . . # .
. . # . . .
# . . . . .
. . . . . #
. . . # . .
. # . . . .
6 ------> 4