西洋棋中的皇后可以直線前進,吃掉遇到的所有棋子,如果棋盤上有八個皇后,則這八個皇后如何相安無事的放置在棋盤上,1970年與1971年, E.W.Dijkstra與N.Wirth曾經用這個問題來講解程式設計之技巧。
解法
關於棋盤的問題,都可以用遞迴求解,然而如何減少遞迴的次數?在八個皇后的問題中,不必要所有的格子都檢查過,例如若某列檢查過,該該列的其它格子就不用再檢查了,這個方法稱為分支修剪。
八個皇后
所以檢查時,先判斷是否在已放置皇后的可行進方向上,如果沒有再行放置下一個皇后,如此就可大大減少遞迴的次數,例如以下為修剪過後的遞迴檢查行進路徑:
八個皇后
八個皇后的話,會有92個解答,如果考慮棋盤的旋轉,則旋轉後扣去對稱的,會有12組基本解。
class Queen
def initialize
@queen=Array.new(8+1,0)
@colum=Array.new(8+1,0)
@rup=Array.new(2*8+1,0)
@lup=Array.new(2*8+1,0)
end
def backtrack
for i in 1..8
@colum[i]=1
end
for j in 1..2*8
@rup[j]=1
@lup[j]=1
end
_backtrack(1)
end
def _backtrack(i)
if i>8
_print
else
for j in 1..8
if @colum[j]==1 && @rup[i+j]==1 && @lup[i-j+8]==1
@queen[i]=j
@colum[j]=0
@rup[i+j]=0
@lup[i-j+8]=0
_backtrack(i+1)
@colum[j]=1
@rup[i+j]=1
@lup[i-j+8]=1
end
end
end
end
def _print
for y in 1..8
for x in 1..8
if @queen[y]==x
print "Q"
else
print "."
end
end
puts "\n"
end
puts "\n"
end
end
queen=Queen.new
queen.backtrack
分享到:
相关推荐
### 8皇后问题详解 #### 一、问题背景与定义 8皇后问题是一个经典的问题,在计算机科学领域中常被用来作为回溯法(Backtracking)的示例。该问题最初由国际象棋爱好者马克斯·贝瑟尔在1848年提出,要求在一个8×8...
8皇后问题 8皇后问题 8皇后问题
8皇后问题JAVA算法 用递归实现,程序种有两种判定皇后可放的方法 一种采用辅助数组,一种采用斜率判断 代码比较简洁,对递归的理解和掌握有帮助 测试结果: 1 :1 5 8 6 3 7 2 4 2 :1 6 8 3 7 4 2 5 3 :1 7 4 6 8 2 ...
8皇后问题算法实现,基于Java的8皇后问题
在IT领域,尤其是在编程与算法设计中,"解决8皇后的C++最简单方法"这一题目,涉及到的是经典的回溯算法应用。8皇后问题是指在一个8×8的棋盘上放置8个皇后,使得任意两个皇后都不会互相攻击,即任何两个皇后不能处于...
### 8皇后问题的两种解法(C语言描述) #### 方法一:回溯法 **回溯法**是一种通过尝试解决子问题,并且能够“撤销”答案的算法。8皇后问题是一个经典的计算机科学问题,其目标是在一个8×8的棋盘上放置8个皇后,...
c语言的代码,解决8皇后问题,输出为棋盘式的0,1点阵图,有需要可下载
极好的8皇后问题的算法解析,有非常详细的解释和代码
8皇后问题 人工智能设计的8皇后问题,启发式搜索
用python解决的8皇后问题,版本是python3.4
8皇后C语言实现,简洁,易懂
8皇后问题复杂性描述,输入一定方格个数,即可输出最好的排列方式。
自己写的用回溯法解决8皇后问题,java实现
利用回溯法解决8皇后问题,简单并且和很好理解!
一个简单的8皇后算法,供初学数据结构的同学参考,c语言实现
Java代码写的8皇后问题的分支限界法解法 源代码
详细的介绍了8皇后问题的思路及算法代码 思路清晰
8皇后的两种解法,一种是递归,一种是迭代,并且求出了所有的解,并存放在word中。
8皇后问题求一个精确解,通过递归调用,实现回溯的方法,也是一个深度优先搜索的经典问题
在8皇后问题中,n的值为8,即在8×8的棋盘上放置8个皇后。 **1. 回溯法** 回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,如果在某一步发现当前路径无法到达目标状态,则退回一步,尝试其他路径。在...