摘要: 这个学期开始之前就接了一个师兄的不围棋(围棋变种,详情看:不围棋)项目,但是那师兄的代码写得太烂了,而且也不是一个真正的我理解的棋类游戏(没有评估函数、没有多层搜索,只是用代码把自己能想到的情况写了应对方法而已)。虽然可以符合规则地下一下,但是很难改善棋力,而且有众多bug需要修复。故看完他的程序之后,自己就决心重新写一个。因为自己完全没有关于博弈的知识,从一开始就边学边做。这两个多月的学习以来,把能碰到的问题都基本解决了,但对于一个对围棋及其变种完全不了解的我,要在短时间内写出一个好的评估函数难度很高。再加上因为是新棋种,关于不围棋的资料几乎没有,思考了一个多月后还是写不出评估函数。濒临.. 阅读全文
posted @ 2013-11-30 15:02 joyingx 阅读(1670) 评论(0) 推荐(0)
摘要: 平常我们用暴力破解来判断n是否是素数时,都是用n试除2到√‾n判断的。但其实这中间就多了很多冗余的判断了,例如:一个数不能被2整除,那就证明了它不能被4、6、8这样的能被2整除的数整除。我们将这些冗余的数去除掉之后就能加快判断的速度。 那么,将这样的冗余的数去除之后的数会出现什么样的规律呢?我们先拿2和3来测试一下,计算一个数和前一个数的差并全部输出: 1 #include 2 #include 3 4 int main(int argc, char *argv[]) 5 { 6 long i, last = 7; 7 for (i = 8; i 2 #incl... 阅读全文
posted @ 2013-11-23 12:54 joyingx 阅读(3040) 评论(0) 推荐(0)
摘要: 什么是动态规划? 先来看看《算法导论》里面的解释:动态规划(dynamic programming)与分治法相似,都是通过组合子问题的解来求解原问题。动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。这种算法对每个子子问题只求解一次,将其解保存在一个表格中,从而无需每次求解一个子子问题时都重新计算,避免了不必要的计算工作。 设计一个动态规划算法需要4步: 1.描述最优解的结构。 2.递归定义最优解的值 3.按自底向上的方式计算最优解的值 4.由计算出的结果构造一个最优解。 这4步中的前3步是动态规划的基础,即前3步用自底向上的方法,从最底层的已经有解的子子问题... 阅读全文
posted @ 2013-11-15 13:02 joyingx 阅读(581) 评论(0) 推荐(0)
摘要: 最近对几个常见排序算法进行复习和总结,发现认真思考一下然后代码练习一下,这些排序基本上不会有太大难度。做任何事都是一样,难在你把它想得太难了,逼下自己,动脑思考一下,事情就会变得很简单。 下面是我个人对常见几个排序算法的理解和代码实现,如有什么错误还请指出。1.最简单的排序 -- 冒泡排序 原理就是:从第一个数开始,和后面的数两两进行比较;若前面的数比后面的数大,则将其后移。一轮下来,最后一个数一定是最大的。所以现在可以抛弃最后一个数,从第一个数开始,到倒数第二个数,重复以上步骤。依此类推,最后只剩下两个数比较交换完后,排序结束。 图1.冒泡排序(动态图来自维基百科,下同) 前面几... 阅读全文
posted @ 2013-11-03 15:22 joyingx 阅读(364) 评论(0) 推荐(0)