erl_递归-八皇后问题
2015-09-14 11:39
225 查看
实现八皇后问题的方法,是数据结构与算法中非常经典的一个算法。
一般在八皇后问题中,我们要求解的是一个8*8的国际象棋棋盘中,放下8个皇后且互相不能攻击的排列总数。皇后的攻击范围为整行,整列,以及其斜对角线。
由于皇后的攻击范围特性,注定我们每行只能放下一个皇后,于是我们要做的只是逐行放下皇后。八皇后问题是回溯法的典型问题。这里我们用的方法很简单:
从第一行开始逐个检索安全位置摆放皇后,一旦有安全位置则考虑下一行的安全位置。如果发现某行没有安全位置,则返回上一行继续检索安全位置;如果发现在最后一行找到了安全位置则输出整个棋盘。
代码如下:
一般在八皇后问题中,我们要求解的是一个8*8的国际象棋棋盘中,放下8个皇后且互相不能攻击的排列总数。皇后的攻击范围为整行,整列,以及其斜对角线。
由于皇后的攻击范围特性,注定我们每行只能放下一个皇后,于是我们要做的只是逐行放下皇后。八皇后问题是回溯法的典型问题。这里我们用的方法很简单:
从第一行开始逐个检索安全位置摆放皇后,一旦有安全位置则考虑下一行的安全位置。如果发现某行没有安全位置,则返回上一行继续检索安全位置;如果发现在最后一行找到了安全位置则输出整个棋盘。
代码如下:
%%八皇后问题 :在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突。 eitht_queen()-> spawn(fun() -> queen_pos_y(0) end), ok. queen_pos_y(DY)-> QueenList = get_queen(), lists:foreach(fun(DX)-> case is_safe(DX,DY,QueenList) of true-> QueenListNew = [{DX,DY}|QueenList], set_queen(QueenListNew), if DY < 7 -> queen_pos_y(DY+1); true-> io:format("printf ~p ~n",[{"count :",get_count(),"queen pos list :",QueenListNew}]) end; _-> nil end end,lists:seq(0,7)). get_queen()-> case get(queen) of undefined-> []; L-> L end. set_queen(QL)-> put(queen,QL). get_count()-> case get(count) of undefined-> put(count,1), 1; C-> put(count,C+1), C+1 end. is_safe(_,_,[])-> true; is_safe(DX,DY,QueenList)-> try lists:foreach(fun(TTY)-> {TTX,_} = lists:keyfind(TTY,2,QueenList), if TTX == DX -> throw(false); TTY == DY-> throw(false); TTX - TTY == DX - DY orelse TTX + TTY == DX + DY -> throw(false); true-> nil end end,lists:seq(0,DY-1)), true catch _:_-> false end.
相关文章推荐
- 泛型约束
- 冒泡排序
- JavaDoc文档编写学习
- ARC和MRC在同一个工程中的使用
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保<machineKey>
- cocos2d-x 血量条实现:LoadingBar、ProgressTimer和Slider实现示例
- 你好,未来!再见,传志!----一封公开信给所有同事柳传志播客
- Linux主机下安装Mysql数据库
- 常用手势识别 swift
- 服务器如何进入Bios
- 【iOS开发】ReactiveCocoa配置
- Eclipse快捷键 10个最有用的快捷键
- eclipse 工作环境配置
- iOS 3行代码搞定导航控制器全屏滑动返回效果
- 分区使用100%导致不能写入
- 框架之minicap工具
- 《算法导论》学习心得
- Android --ListView分页
- mac下svn问题——“.a”(静态库)文件无法上传解决
- 机器学习算法中常用的各种metrics分析