前几天园子里有人发表关于8皇后的算法.只有代码,没有能运行的DEMO多枯燥.于是我这两天抽时间写了个N皇后的屏保程序.程序启动后会从4皇后到14皇后显示其所有排列,每隔0.5秒自动切换一次.按下空格键会停止自动切换,按-=键可以手动切换排列.算法是对网上找的程序做了点修改,先申请一块8M的内存区域,将N皇后中所有合适的位置保存到该内存中,代码如下:

 static Ybyte g_listQueen[YD_MAX_STACKS_NUM] = {};  

 bool check_pos_valid(Ybyte loop, Ybyte value)
{
Ybyte index;
Ybyte data; for(index = ; index < loop; index ++)
{
data = g_listQueen[index]; if(value == data)
return false; if((index + data) == (loop + value))
return false; if((index - data) == (loop - value))
return false;
} return true;
} void CNQueenEntitySP::CalculateQueen(Yuint index)
{
Ybyte loop; for(loop = ; loop < m_stacks; loop++)
{
if(check_pos_valid(index, loop))
{
g_listQueen[index] = loop; if(m_stacks - == index)
{
//assert((m_resultsCount + 1)*m_stacks < YD_BUFFER_SIZE);
memcpy(m_resultBuffer + m_resultsCount*m_stacks, g_listQueen, m_stacks);
m_resultsCount++;
g_listQueen[index] = ;
return;
} CalculateQueen(index + );
g_listQueen[index] = ;
}
}
}

算法使用的是递归,让人感觉有些费解,我也是看好好久才搞明白.其实N皇后问题可以写成一个N重循环,而为了解决N的不确定性,所以采用了递归算法.因此使用递归和使用N重循环其算法的复杂度是一样的.其算法运算量随着N数目的增加会爆增.生成14皇后的数据非常耗时,请耐心等待.再说递归,这样的代码多少都让人头疼,而实际应用中,我很少使用递归.印象中只有遍历文件夹时才用过,很早之前还写过一个无限递归的BUG导致堆栈爆掉,忘了是做什么应用了.再有就是上学时学算法,老师教的是所有的递归算法都可以改成循环,而考试的一个题目就是将某个递归算法改循环.其实反过来说,所有的循环也可以改成递归,我学过一个神一样的语言prolog,它里面貌似没有循环,所有的循环逻辑都是用递归实现的.写它的代码有种要疯的感觉.

对于8皇后算法,最早接触是上大学时开过一门课叫面向对象的程序设计,教材中有个DEMO是8皇后.后来这课的课程设计,大部分同学交的就是这个8皇后算法.我的也是,而且还是拷贝别人的.对这门课我目前也只有这点印象,因为当时我这课基本没怎么上,也根本不懂什么是面向对象.谁让这课的学分不高,考研不考呢.毕业后这本书也不见了,我现在很疑惑的是:8皇后问题和面向对象有什么关系呢?希望哪天能找到这书教材,看看这书写过什么.

"NQueenSP.scr"全屏可执行程序
"NQueen.exe"窗口可执行程序

鼠标左键右键拖动,调节视角.
鼠标滚轮,调节摄像机的远近.
X,恢复为默认视角并停止视角旋转.
空格,P,暂停与恢复.
ESC,退出.

R N皇后重新开始.
[ 减少皇后数.最小为4
] 增加皇后数.最多为14
- 上一个排列
=  下一个排列

下载地址:

http://files.cnblogs.com/WhyEngine/NQueenSP.zip

屏保设置方式
XP:
将目录下的所有文件拷贝到WINDOWS系统目录下如"C:\WINDOWS\system32"
WIN7,WIN8:
将目录下的所有文件拷贝到"C:\WINDOWS\SysWOW64"或"C:\WINDOWS\SysWOW32"目录下

在设置屏保的对话框中,选择"NQueenSP"

3D屏保:N皇后的更多相关文章

  1. 3D屏保: 线圈

    LineFlower3DSP 一个3D屏保程序,算法的原理类似于圆内轮旋线的生成. 下载地址: http://files.cnblogs.com/WhyEngine/LineFlower3D_sp.z ...

  2. 3D屏保:排色榜

    3D屏保:排色榜 排色榜,是一个针对图形学中的色彩进行排序的DEMO,这里的色是色彩的意思,看成别的点进来的同学请自觉面壁.该DEMO可以按RGB,GBR,BRG,灰度值四种方式进行排序.排序算法为冒 ...

  3. 3D屏保: 彩色盘子

    一个彩色盘子的屏保 记得小时候在电视上看过一个科普节目,由多个颜色组成的盘子,如果快速旋转起来,会看上去是白色的.于是我就写了这个屏保程序,但发现在计算机上模拟并不是这样的. "RollPl ...

  4. 3D屏保:魔方2.0版本

    一个三维魔方的屏保软件,可支持2级到72级的魔方.启动后魔方会自动旋转,并最终回到初始状态.有很多人问我这是怎么做到的,用的什么解魔方的算法,其实我自己根本就不会玩魔方,别人用技巧解魔方,我这程序中用 ...

  5. 3D屏保程序:汉诺塔

    学过程序的人一定记得汉诺塔.我们学的第一个程序是HelloWorld,而碰到的第一个坑就是汉诺塔,短短十几行代码,不知花费了多少时间精力去理解.我记得当年的开发环境还是蓝屏的,汉诺塔程序的输出还是一行 ...

  6. html5 canvas 3d屏保 源码

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  7. C#制作简易屏保

    前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...

  8. 一个仿windows泡泡屏保的实现

    一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...

  9. 仿W8屏保

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. win划分磁盘

    我的电脑-->管理 磁盘管理: 右键压缩卷 输入压缩空间量,进行压缩 右键未分配的磁盘-->新建逻辑卷 选取需要的格式

  2. 在Ubuntu18.04中QT编程的环境构建(转)

    在Ubuntu18.04中QT编程的环境构建 原点分析 百家号06-2110:14 如果说QT大家觉得陌生的话,那么 Windows 早年推出的C++图形用户界面的应用程序开发框架MFC,应该是耳熟能 ...

  3. 远程连接mysql root账号报错:2003-can't connect to MYSQL serve

    1.远程连接Linux系统,登录数据库:mysql -uroot -p(密码) 2.修改root账号的设置: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDE ...

  4. scp和rsync的区别和常用参数

    一.scp 命令 1.scp 是 secure copy 的缩写,用于远程的文件的复制. 2.参数: -r: 递归复制整个目录. 3.实例: scp /home/space/music/1.mp3 u ...

  5. [CodeForces]CodeForces - 1025F Disjoint Triangles

    题意: 给出平面上n个点,问能在其中选出6个点,组成两个三角形,使得其互不相交 问有多少种选法 大致思路  考虑枚举一条直线,将所有得点分为左右两部分,其中有两个点在直线上, 以这两个点为顶点,分别统 ...

  6. 2017 Idea 最简易破解 (无需jar包)(个人整理)

    首先 修改host文件: 文件路径:C:\Windows\System32\drivers\etc\hosts 修改:将“0.0.0.0 account.jetbrains.com”追加到hosts文 ...

  7. AlertDialog对话框

    普通对话框 public void click1(View v) { //这里不能用 getApplicationContext()方法来获取上下文 AlertDialog.Builder build ...

  8. dhcp 提示could not load neutron.agent

    错误日志如下: N版存在问题,其它版本不知道 解决方法(代码问题): /usr/lib/python2.7/site-packages/neutron/common/utils.py 在这个方法上(d ...

  9. NandFlash_control

    驱动:编写任何设备的驱动程序,都需要对该设备的原理有一定了解和认识.对于外部设备的访问总是需要通过一个控制器来间接访问,对于这个控制器的控制程序称为驱动程序 Nandflash 原理: 一:角色分析 ...

  10. [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)

    显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...