前几天园子里有人发表关于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. Hadoop整理四(Hadoop分布式计算框架MapReduce)

    Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提 ...

  2. 整理之DOM事件阶段、冒泡与捕获、事件委托、ie事件和dom模型事件、鼠标事件

    整理之DOM事件阶段 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可见.比如说React中的单向数据流,Node中的流,又或是今天本文所讲的 ...

  3. SDOI 2017 Round2 滚粗了

    没进省队qwq 技不如人,甘拜下风

  4. Struts2 (下)

    接收参数 当发送一个请求时,除了使用RequestApi来接收参数之外,Struts2内部提供了3种接收参数的方式 接收参数的方式 1. 提供属性set方法的方式 在Action当中提供对应属性的se ...

  5. 模型构建<2>:不平衡样本集的处理

    分类预测建模都有一个基本的假设,即样本集中不同类别的样本个数基本相同,但是在实际任务中,经常会出现各类样本个数差别较大的情况,这样的样本集就是不平衡样本集,它对学习建模的性能会带来很大的影响,因此必须 ...

  6. Codeforces Round #FF (Div. 1) A. DZY Loves Sequences 动态规划

    A. DZY Loves Sequences 题目连接: http://www.codeforces.com/contest/446/problem/A Description DZY has a s ...

  7. TensorFlow安装和HelloWorld

    TensorFlow安装 TensorFlow可以在各种操作系统上面安装.安装的时候要注意TensorFlow的类型,一种是普通的版本,仅支持CPU,安装简单.另外一种类型带GPU的,可以利用GPU来 ...

  8. jmeter-分布式部署之负载机的设置

    本文分三个部分: 1.windows下负载机的配置 2.Linux下负载机的配置 3.遇到的问题 *************************************************** ...

  9. Linux的本地时间和网络时间同步

    Linux本地时间和网络时间不同步,更新了之后,重启还会变回去.可以通过一下方法修改并保存. 1.  安装ntpdate工具 sudo apt-get install ntpdate 2.  设置系统 ...

  10. SQL(insert、delete、update)执行成功,但是数据库表中无显示无记录

    如题,程序中insert一条记录,调试过程中根据执行结果发现此条sql已经执行成功(影响行数为1且插入记录已生成自增主键正确值),但是查询数据库相应表时发现表中并无相应记录,通过直接在表中插入测试数据 ...