如何用Python递归回溯法巧妙解决八皇后问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计4401个文字,预计阅读时间需要18分钟。
八皇后问题描述:在一个88的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行、同一列或同一斜线上。问有多少种解法。
规则分析:- 任意两个棋子不能在同一行。- 任意两个棋子不能在同一列。- 任意两个棋子不能在同一斜线上。
八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法。
规则分析:
任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元素代表一行,就能达到要求
任意两个棋子不能在同一列也比较好处理,设置的队列里每个元素的数值代表着每行棋子的列号,比如(0,7,3),表示第一行的棋子放在第一列,第二行的棋子放在第8列,第3行的棋子放在第4列(从0开始计算列号)
任意两个棋子不能在同一斜线上,可以把整个棋盘当作是一个XOY平面,原点在棋盘的左上角,斜线的斜率为1或者-1,X为列号,Y为行号,推出斜线的表达式为Y=X+n或者Y=-X+n(n为常数,斜线确定下来之后n就确定了),进而可以推导出Y-X=n或者Y+X=n。也就是说在同一斜线上的两个棋子行号与列号之和或者之差相等。X1+Y1=X2+Y2或者X1-Y1=X2-Y2。再进行变换能够得到X1-X2=Y2-Y1或者X1-X2=Y1-Y2,也就是说|X1-Y1|=Y1-Y2。即判断两个棋子是否在同一斜线上,只要判断出两个棋子的列号之差是否等于两个棋子的行号之差的绝对值就行了。
本文共计4401个文字,预计阅读时间需要18分钟。
八皇后问题描述:在一个88的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行、同一列或同一斜线上。问有多少种解法。
规则分析:- 任意两个棋子不能在同一行。- 任意两个棋子不能在同一列。- 任意两个棋子不能在同一斜线上。
八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法。
规则分析:
任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元素代表一行,就能达到要求
任意两个棋子不能在同一列也比较好处理,设置的队列里每个元素的数值代表着每行棋子的列号,比如(0,7,3),表示第一行的棋子放在第一列,第二行的棋子放在第8列,第3行的棋子放在第4列(从0开始计算列号)
任意两个棋子不能在同一斜线上,可以把整个棋盘当作是一个XOY平面,原点在棋盘的左上角,斜线的斜率为1或者-1,X为列号,Y为行号,推出斜线的表达式为Y=X+n或者Y=-X+n(n为常数,斜线确定下来之后n就确定了),进而可以推导出Y-X=n或者Y+X=n。也就是说在同一斜线上的两个棋子行号与列号之和或者之差相等。X1+Y1=X2+Y2或者X1-Y1=X2-Y2。再进行变换能够得到X1-X2=Y2-Y1或者X1-X2=Y1-Y2,也就是说|X1-Y1|=Y1-Y2。即判断两个棋子是否在同一斜线上,只要判断出两个棋子的列号之差是否等于两个棋子的行号之差的绝对值就行了。

