16皇后问题有多少解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16皇后问题有多少解相关的知识,希望对你有一定的参考价值。

16皇后问题有92种解法。它是一个著名的搜索问题,也是一个古老的数学问题,由十九世纪的棋手马克斯·贝瑟尔提出。问题的定义是:如何在一个8x8的国际象棋棋盘上放置16个皇后,使得它们不会相互攻击。即任何两个皇后都不能处于同一行、同一列或同一斜线上。

解决16皇后问题的方法有很多种,其中最常用的是回溯法,也可以使用其他搜索方法。回溯法的基本思想是:从第一行的第一列开始,每次尝试放置一个皇后,并且检查是否有冲突。如果没有冲突,就继续尝试放置下一个皇后,直到所有的皇后都被放置在棋盘上,或者没有可用的位置可以放置皇后。使用回溯法,可以计算出16皇后问题的92种解法。
参考技术A 左右

16皇后问题共有2,279,184种解法。16皇后问题是指在8×8的国际象棋棋盘上放置16个皇后,使得任意的两个皇后不能处于同一行、同一列或同一斜线上,这是一个典型的NP问题。由于皇后可以放置的位置有很多,因此可能存在多种解法,其中最多可以达到2,279,184种解法。

八皇后究竟有多少种解法?怎么解?

参考技术A 这样算是最佳解

class Queen8

static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax];

public static void main(String args[])
for (int i=0;i<QueenMax;i++)chess[i]=-1;
placequeen(0);
System.out.println("\n\n\n八皇后共有"+oktimes+"个解法 made by yifi 2003");


public static void placequeen(int num)

int i=0;
boolean qsave[] = new boolean[QueenMax];
for(;i<QueenMax;i++) qsave[i]=true;

i=0;
while (i<num)
qsave[chess[i]]=false;
int k=num-i;
if ( (chess[i]+k >= 0) && (chess[i]+k < QueenMax) ) qsave[chess[i]+k]=false;
if ( (chess[i]-k >= 0) && (chess[i]-k < QueenMax) ) qsave[chess[i]-k]=false;
i++;

for(i=0;i<QueenMax;i++)
if (qsave[i]==false)continue;
if (num<QueenMax-1)
chess[num]=i;
placequeen(num+1);

else //num is last one
chess[num]=i;
oktimes++;
System.out.println("这是第"+oktimes+"个解法 如下:");
System.out.println("第n行: 1 2 3 4 5 6 7 8");

for (i=0;i<QueenMax;i++)
String row="第"+(i+1)+"行: ";
if (chess[i]==0);
else
for(int j=0;j<chess[i];j++) row+="--";
row+="++";
int j = chess[i];
while(j<QueenMax-1)row+="--";j++;
System.out.println(row);





多少种解法就不好说了..
参考技术B 总共92中解法
# 回溯算法
def NQueens(n):
def checkBoard(rowIndex):
for i in range(rowIndex):
if cols[i] == cols[rowIndex]:
return False
if abs(cols[i] - cols[rowIndex]) == rowIndex - i:
return False
return True

def helper(rowIndex):
if rowIndex == n:
board = [[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
board[i][cols[i]] = 1
res.append(board)
return
for i in range(n):
cols[rowIndex] = i
if checkBoard(rowIndex):
helper(rowIndex + 1)

cols = [False for _ in range(n)]
res = []
helper(0)
return res

if __name__ == '__main__':
li = NQueens(8)
for i in range(len(li)):
print(f'i+1:li[i]')
# for j in range(len(li[i])):
# print(li[i][j])
# print()
参考技术C 一共有92种回答,我只写出了一种,是c1e2b3h4a5g6d7f8。 参考技术D 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
  对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象、更生动,使教学能产生良好的效果。下面是用Turbo C实现的八皇后问题的图形程序,能够演示全部的92组解。八皇后问题动态图形的实现

以上是关于16皇后问题有多少解的主要内容,如果未能解决你的问题,请参考以下文章

八皇后问题

八皇后问题

回溯法解决八皇后问题

回溯法解决八皇后问题

八皇后问题

八皇后