程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

随笔分类 -  问题求解

Futoshiki求解
摘要:Futoshiki求解 Futoshiki是对于一个n的方阵,需要满足如下条件: ·每一行和每一列的元素都不能重复,即每一行和每一列1到n,n个数字都出现,且只出现一次。 ·同一行或同一列中相邻两个元素需要满足预先设定的一些关系,比如大于、小于等等。 例如,有以下样例: 这是一个5的方阵,方阵中元素为0的元素表示该元素为空,即还没有放置1-n中的某个数字。初始方阵中有些元素已经被放置了,这些元素不能被修改。同一行的元素被|字符间隔,同时也有关系符,来规定相邻两个元素的关系。同样,同一列的元素被-字符间隔,同时^和v字符用来规定相邻两个元素间的关系。 对应于上面的初始方阵,有 阅读全文

posted @ 2014-01-13 23:59 unixfy 阅读(1181) 评论(0) 推荐(0) 编辑

约束条件下的优化问题
摘要:约束条件下的优化问题 给定一系列训练,每个训练有以下几个属性:名字能量消耗可以被选的阶段个数阶段1阶段2…… 有x个阶段,每个阶段又有如下以下两个限制: 1.每个阶段中最多不能包含超过n个训练,也就是说训练个数小于等于n; 2.每个阶段里的能量消耗总和不得大于m。 在这种约束条件下,求得所有阶段能耗消耗总和最大的组合。每个训练最多可以被选择一次,可以不被选择。 这个问题咋一看有点类似于背包问题,每个训练最多可以被选择一个,有点像是01背包问题,并且也有限制条件,比如每个阶段不得大于n个训练,能耗之和不得大于m,但最终也想求得所有阶段能耗最大的组合。 背包问题有很多种,诸如01背包、完全背包、多 阅读全文

posted @ 2013-12-26 00:38 unixfy 阅读(3336) 评论(0) 推荐(0) 编辑

家谱树的建立和求解最大路径
摘要:家谱树的建立和求解最大路径 家谱树也称为家谱图,用来标识家族中人员的关系等。 给定一个家谱树文件,文件格式是: 1.第一行是一个整型的数n,表示这个家谱树中成员的个数。 2.后面紧跟着n行数据,每行代表一个成员,其格式为:名字姓性别年龄 由四部分信息组成,其中性别M表示男性,F表示女性。 3.后面继续跟m行数据,m未知,用来表示成员间的父母-孩子关系,其格式为:孩子名孩子姓父亲名父亲姓母亲名母亲姓 我们要做的工作是: 1.设计合理的数据结构,用来保存每个成员、成员间的关系,以及整个家谱树。 2.根据指定的性别,找到在家谱树中性别都为该性别的最长路径。 3.求解家谱树中年龄之和最大的路径。 比如 阅读全文

posted @ 2013-12-26 00:32 unixfy 阅读(1614) 评论(0) 推荐(0) 编辑

图的建立、广度优先遍历和深度优先遍历
摘要:图的建立、广度优先遍历和深度优先遍历 图分为有向图和无向图,再根据是否有权重又可以分为有权重图和无权重图。图常用的表示方式有邻接矩阵和邻接表。这里我们处理的图是有向、无权重图,采用的表示方式是邻接表。 图的数据保存在文件中,比如: a 1 b b 2 c e c 1 f d 2 c f e 1 a f 0 其中,第一个元素表示图中节点的名字,第二元素表示其可以直接到达的节点个数,后面紧跟着直接可以达到的节点。 我们采用的表示方式是邻接表,邻接表首先针对图中的节点定义一个数组,用来记录每个节点,数组中的每个节点元素后面跟着一个链表,在该链表中记录着其可以直接到达的节点。 节点的定义有以下几个部分 阅读全文

posted @ 2013-12-22 17:11 unixfy 阅读(10730) 评论(0) 推荐(0) 编辑

多叉树的设计、建立、层次优先遍历和深度优先遍历
摘要:多叉树的设计、建立、层次优先遍历和深度优先遍历 早起曾实现过一个简单的多叉树《实现一个多叉树》。其实现原理是多叉树中的节点有两个域,分别表示节点名以及一个数组,该数组存储其子节点的地址。实现了一个多叉树建立函数,用于输入格式为A B。A表示节点的名字,B表示节点的子节点个数。建立函数根据用户的输入,首先建立一个新的节点,然后根据B的值进行深度递归调用。用户输入节点的顺序就是按照深度递归的顺序。另外,我们实现了一个层次优先遍历函数。该函数用一个队列实现该多叉树的层次优先遍历。首先将根节点入队列,然后检测队列是否为空,如果不为空,将队列出队列,访问出队列的节点,然后将该节点的子节点指针入队列,依次 阅读全文

posted @ 2013-12-22 17:06 unixfy 阅读(43096) 评论(3) 推荐(5) 编辑

通过赔率预测比赛
摘要:通过赔率预测比赛 根据历往博彩公司开的赔率以及每次比赛的胜负,运用分类算法(本质上是二元分类,因为只是针对胜负)进行未来比赛的预测。得到的结果并不算很理想。主场情况下,最好只能达到七成的准确率,客场更差,对于二串一的玩法这种准确率无法胜任。 采用的分类算法是KNN,KNN的实现也可以详见之前的C++Blog上的博文,特征向量间距离是采用欧氏距离,特征向量间距离和相似度的计算可以详见C++Blog博文。 发表一下个人对于基于统计学习方法的看法:机器学习或者基于统计的方法是没有办法的办法,无法通过规则得到良好的结果,所以只能依赖于历史数据,经过大规模运算得到一个看上去还可以的结果。这种看上去还可以 阅读全文

posted @ 2013-12-16 14:17 unixfy 阅读(999) 评论(0) 推荐(0) 编辑

利率的计算
摘要:利率的计算 假设一段时间Y内的利率为IR,这段时间可以划分为DS个时间片,每个时间片的利率DIR=IR/DS。本金为P,计算一段时间Y后的本金+利息和:P1=P(1+IR)P2=P(1+DIR)^DSP3=P(1+IR)(1+IR) 其中,P1必定小于P2。比较P2和P3的大小关系即是比较(1+DIR)^DS和(1+IR)^2的大小关系。这取决于DIR、DS、IR,本质上是DS、IR。 假设IR=5%,DS=365,P=1000,计算P1和P2的值。#include using namespace std;double PrincipalAndInterest(double pricipal, 阅读全文

posted @ 2013-12-12 00:40 unixfy 阅读(245) 评论(0) 推荐(0) 编辑

区间划分操作
摘要:区间划分操作 输入几个区间,根据已知区间的边界,划分成更小的区间,比如有区间:[1,1] [2,2] [3,8] [5,7] [7,9] 我们希望重新划分得到的结果为:[1,1] [2,2] [3,5] [5,7] [7,7] [7,8] [8,9] 我们的基本做法是首先定义边界结构体,边界分为两种情况:左边界和右边界。 区间划分函数,我们是首先按照各个边界在数轴上的排序,从小到大依次排列,然后顺序检测当前区间边界为左边界还是右边界,然后再检测上一个边界是左边界还是右边界。根据各种情况进行相应的操作。 程序中,我们的区间划分函数有两个版本,其中第二个版本是严格按照上述思想进行的实现。第一个版本 阅读全文

posted @ 2013-12-10 21:23 unixfy 阅读(1157) 评论(0) 推荐(0) 编辑

双色球的简单统计和预测
摘要:双色球的简单统计和预测 从网上下载了今年截止目前(2013.11.19)的双色球数据,统计历来红色球和蓝色球出现的最大次数和最小次数。根据简单的统计结果预测下一期中奖号码。但是结果是不尽如人意的。预测120次统计结果,其中根据最大次数预测中奖次数为11次,根据最小次数预测中奖次数为2次,并且中奖结果都是五等奖(10元奖金)和六等奖(5元奖金),而120次购买彩票至少投入是240元,最高奖金也就是110元。显然,这是一笔亏本的生意。 网上的数据如下:// History.txt2013-11-19 2013136 04 06 14 16 18 26 06 369,164,73... 阅读全文

posted @ 2013-11-20 00:06 unixfy 阅读(989) 评论(1) 推荐(0) 编辑

参数解析之写入参数解析
摘要:参数解析之写入参数解析 之前我们有篇关于参数解析的文章《参数解析》,在文章中我们讨论了对函数参数进行了解析,分为两种方法:状态转换图和顺序扫描。函数参数为一个字符串,格式为:file1|dataitem1|dataitem2|dateitem3|$file2|dataitem4|dataitem5|$file3|dataitem6|$ 通过我们的解析得到: file1 dataitem1 dataitem2 dataitem3 file2 dataitem4 dataitem5 ... 阅读全文

posted @ 2013-10-09 23:20 unixfy 阅读(495) 评论(0) 推荐(0) 编辑

ASC与HEX之间的转换
摘要:ASC与HEX之间的转换 有这么两个函数:函数原型功能返回值参数备注hex2asc__int16 hex2asc(unsigned char *strhex,unsigned char *strasc,__int16 length);字符串转换函数,十六进制字符转换成普通字符成功则返回 0,否则返回非0strhex:要转换的字符strasc:转换后的字符length:字符strasc的长度长转短asc2hex__int16 asc2hex(unsigned char *strasc,unsigned char *strhex,__int16 length);字符串转换函数,普通字符转换成十六进 阅读全文

posted @ 2013-09-14 14:40 unixfy 阅读(10836) 评论(1) 推荐(0) 编辑

进制之间的转换
摘要:进制之间的转换一、谈谈几个库函数函数原型功能参考atoiint atoi(const char* nptr);把字符串换化成整型数百度百科itoachar* itoa(int value, char* string, int radix);将整型数转换为radix进制数的字符串形式百度百科atollong atol(const char* nptr);把字符串转换成长整型数百度百科atofdouble atof(const char* nptr);把字符串转换成浮点数百度百科strtoddouble strtod(const char* nptr, char** endptr);把字符串转换成 阅读全文

posted @ 2013-09-12 16:42 unixfy 阅读(758) 评论(0) 推荐(0) 编辑

参数解析
摘要:参数解析 一函数传递的参数为以字符串,其具体格式是用”$”和”|”来间隔文件名和数据项名,我们的工作时将参数字符串进行解析,得到一个个具体的文件名-数据项的形式。 我们可以采用顺序扫描的方法进行解析,也可以利用状态转换图进行解析。 字符串的格式为:文件之间用”$”来间隔,数据项之间用”|”来间隔。 例如:A|01|02|03|04|05|$B|01|02|03|$C|01|09|$ 该字符串指明了四个文件:A、B、C、D,其中,A文件的数据项为01、02、03、04、05,B文件的数据项为01、02、03,C文件的数据项为01、09。 我们是想得到如下的结果: A 01 A 02 A 03 A 阅读全文

posted @ 2013-09-11 10:37 unixfy 阅读(1004) 评论(0) 推荐(0) 编辑

扑克牌的游戏
摘要:扑克牌的游戏 手中有13张扑克牌,分别是1、2、3、4、5、6、7、8、9、10、J、Q、K,这里我们相求一种顺序,使得:每次将牌盖住,将最上面的牌放在最下面,再将最上面的牌扔出,使得扔出去的牌的顺序依次为:1、2、3、4、5、6、7、8、9、10、J、Q、K。 我们首先给出程序的模拟操作,初始时的顺序依次为:1、2、3、4、5、6、7、8、9、10、J、Q、K。 从初始顺序到结果顺序的过程为:先把初始顺序中的第一个元素放到最下面,然后将之后初始顺序中第一个元素抽出来,放入到结果顺序中。在我们的模拟程序中,用vector保存初始顺序和结果顺序,首先检测初始顺序序列是否为空,如果不为空,则首先将 阅读全文

posted @ 2013-08-27 17:07 unixfy 阅读(318) 评论(0) 推荐(0) 编辑

计算序列中元素的位置
摘要:计算序列中元素的位置 寻找序列中元素的位置,这里序列是有序的。根据序列中元素是否有重复分为无重复序列和有重复序列两种情况。一、无重复的情况:我们只考虑升序的情况,降序的情况与此类似,故不作讨论。比如,有以下序列:3、5、6、8、9、10、15、30、41 待查找元素为15,其位置为6(3的位置为0,位置从0开始计算),其逆位置为2 如果待查找元素在序列中不存在,则返回位置-1,逆位置也是-1。1)顺序查找 最直观的的方法是顺序查找,程序实现如下:// 无重复顺序查找#include <iostream>#include <vector>using namespace s 阅读全文

posted @ 2013-06-22 00:00 unixfy 阅读(677) 评论(0) 推荐(0) 编辑

如何判断是否中奖
摘要:如何判断是否中奖问题描述:假设开奖结果为:A B C,A、B、C可能相同也可能不同,抽奖结果为:X Y Z,X、Y、Z可能相同也可能不同。如何判断A B C与X Y Z有多少个相同的数字。本质上是求两个集合的交集。交集操作:1) 直观的做法:针对集合2种的每个元素,查找其在集合1种是否出现了,如果出现则纳入集合3。对集合2种的元素操作完后,对得到的集合3进行去重,即为交集。如果是顺序查找则时间复杂度是O(M*N)——实现1如果是二分查找,二分查找的前提是排序,则时间复杂度是O(N*logN)或O(M*logM)。 2)改进的做法:分别对集合1、2排序,顺序扫描,进行判断,对匹配的元素纳入交集。 阅读全文

posted @ 2013-06-20 22:45 unixfy 阅读(341) 评论(0) 推荐(0) 编辑

排列、组合的计算
摘要:排列、组合的计算排列从N中选择出M个元素,且保持选择的有序,每选择出M个元素后,将其看做是一组样本,那么样本总数为A(N, M)。A(N, M) = N * N-1 * … * N-M+1 如果M=0,定义A(N, 0) = 1; 如果M=N,则A(N, N) = N * N-1 * N-2 * … * 3 * 2 * 1 = N!(N的阶乘)。组合从N中选择出M个元素,如果不考虑顺序,则样本总数为C(N, M)。C(N, M) = (N * N-1 * … * N-M+1) / (M *M-1 * M-2 * … * 3 * 2 * 1) 如果M=0,定义C(N, 0) = 1; 如果M=N 阅读全文

posted @ 2013-06-20 21:05 unixfy 阅读(603) 评论(0) 推荐(0) 编辑

一个抽奖模型的求解
摘要:一个抽奖模型的求解2013-06-19问题描述: 有3组数,分别都是 [0-9] 10个数字,从中随机分别各选择1个数字,不分先后顺序,作为开奖结果。开奖结果设定后,从中随机分别各选择1个数字,不分先后顺序,作为抽奖结果。 如果3个数字与开奖结果完全匹配,则是一等奖; 如果2个数字与开奖结果匹配,则是二等奖; 如果1个数字与开奖结果匹配,则是三等奖; 如果没有任何数字与开奖结果匹配,则不中奖; 问:1. 开奖结果总共有多少种? 2. 一、二、三等奖的概率各是多少?求解过程: 首选计算开奖结果有多少种。从3组 [0-9] 10个数字中各选1个数字,那么有10^3=1000种情况,但是这是有序的情 阅读全文

posted @ 2013-06-19 23:48 unixfy 阅读(486) 评论(0) 推荐(0) 编辑

导航

点击右上角即可分享
微信分享提示