2012年8月1日

摘要: 洗牌的算法有很多,这里主要介绍下几种主要的算法。 方法一:每次找一个随机的位置,然后将这54个数放到找的位置中。 步骤:1.用一个整型数组记录各个位置是否已经放置了数,如果放置了则不为0,否则为0。所以在算法开始的时候,初始化此数组每个元素的值都为0. 2.每次产生一个0-53之间的数,看这个位置是否放置了数,如果已经放置了,则继续采用同样的方法找一个随机的位置进行判断,如果这个位置还未放置,则设置此位置。 3.反复执行步骤2,直到所有的位置都放好了数。 代码实现如下: 1 void shuffle(int *dest,int N) 2 { 3 int pos,card; 4 ... 阅读全文
posted @ 2012-08-01 20:39 Trony 阅读(8101) 评论(0) 推荐(0) 编辑
 
摘要: Q:例如:有一个序列,例如 9 8 2 1 7 5 3 4 3 2 1. 求出最长的递减子序列。如本例的结果就是:9 8 7 5 4 3 2 1。分析: 可采用动态规划的思想进行解答,时间复杂度为O(n^2). 设原数组为a[1....n]。另设一数组d[1....n],其中d[i]表示从第i个元素开始(一定包含第i个元素),到整个数组末尾的子序列 a[i...n]中的最长递减子序列的长度。 则本问题就是要在求出d[1]的同时,恢复出最优解。 下面给出递推式:d[i]的值分两种情况:1、当i=n时,d[i]=1。即最后一个元素的序列的最大递减子序列中只有它自己。2、当i<n时,d[i]= 阅读全文
posted @ 2012-08-01 16:29 Trony 阅读(4272) 评论(0) 推荐(1) 编辑
 
摘要: 分析此问题,可以利用动态规划的思想来进行解决。对于第i个元素(0<i<N)个元素而言,以其结尾的递增子序列长度由前i-1个数组成的所有递增子序列长度来决定,于是该问题就分为了i-1个子问题。 maxLenIncr[i] = max{ maxLenIncr[k]+1, maxLenIncr[i]} if (a[i]>a[k] && k>=0&&k<i && i>0)而当i=0时,maxLenIncr[0] =1. (maxLenIncr[i]表示以i结尾的最长递增子序列长度。)实现的代码如下: 1 #includ 阅读全文
posted @ 2012-08-01 15:15 Trony 阅读(240) 评论(0) 推荐(0) 编辑

2012年7月2日

摘要: 最近在写一个图像编辑软件,环境是MFC,但是MFC的视图刷新机制使得图像闪烁得非常厉害(图像缩放时尤其明显),在网上查了一些资料,最好的方法是用双缓冲的方式显示,这里总结一下。 双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。主要实现代码如下:1CDCMemDC;//首先定义一个内存显示设备对象2CBitmapMemBitmap;//定义一个位图对象3MemDC.Creat. 阅读全文
posted @ 2012-07-02 10:50 Trony 阅读(255) 评论(0) 推荐(0) 编辑

2012年6月26日

摘要: 摘要 :本文讲述了在指定的编辑框上能响应从键盘输入回车键的一种方法,对进程内消息的解析、动态获取指定资源ID等技术也作了简要描述。关键字 :Microsoft Visual C++ 6.0、编辑框、回车键、消息、资源一、引言 在通常的以CEditView为基类的单文档/多文档视图程序中,可以很好的响应键盘输入的回车键,只需比较最近两次的输入的字符,看看最新输入的字符是否内码是13(0x0d,回车键的内码)即可识别出来,而要单独把一个编辑框放入对话框中却根本不响应,这个看似简单的问题在实际应用中还是解决起来比较困难的。尤其是当一个充当表单录入的对话框上有若干个编辑框,这就要求在一个编辑框添完一项 阅读全文
posted @ 2012-06-26 11:36 Trony 阅读(293) 评论(0) 推荐(0) 编辑

2012年6月20日

摘要: 单链表的基础知识主要包括链表节点的删除、链表节点的插入、链表的排序、链表的逆置、寻找链表的中间节点、寻找链表的倒数第m个节点,本文主要是用代码对这些基础问题进行了实现。typedef struct node{ int data; node *next;}node;节点的删除 1 node *remove(node *head,const int &target) 2 { 3 node *p1,*p2; 4 p1=head; 5 while (p1->data!=target && p1->next!=NULL) 6 { 7 p2=p1; 8 ... 阅读全文
posted @ 2012-06-20 09:36 Trony 阅读(916) 评论(0) 推荐(0) 编辑

2012年6月12日

摘要: 直接贴代码如下: 1 #include <stdio.h> 2 3 int main() 4 { 5 int a=174; 6 int b=1; 7 for (int i=1;i<=698;i++) 8 { 9 b=b*a;10 if (b>10000)11 {12 b%=10000;13 }14 }15 printf("%04d",b);16 return 0;17 } 阅读全文
posted @ 2012-06-12 09:49 Trony 阅读(259) 评论(0) 推荐(0) 编辑

2012年4月8日

摘要: 方法一:这个问题不就是遍历一个数组,并在另一个数组中对第一个数组中的每一个整数进行寻找,看它们之间是否有相同的数字。因为整型数组都是经过排序的,所以我们可以采用二分查找方法来寻找。因为遍历一个数组所需的时间复杂度是O(n)(n代表数组的大小),二分查找所需的时间复杂度是O(log n);故此方法所需的时间复杂度为O(nlog n)。 1 代码如下: 2 bool FindEqualElement1(int a[],size_t dimension1,int b[],size_t dimension2) 3 { 4 assert(dimension1>0 && dimens 阅读全文
posted @ 2012-04-08 14:52 Trony 阅读(3400) 评论(0) 推荐(0) 编辑

2012年4月7日

摘要: 一些字符串的实现函数,没有经过测试,可能有些函数还存在一些错误,有时间再改。 阅读全文
posted @ 2012-04-07 22:24 Trony 阅读(339) 评论(0) 推荐(0) 编辑

2011年11月8日

摘要: 这两天复习了一下排序方面的知识,现将目前比较常见的几种排序方法整理一下。选择排序 选择排序的思想是首先先找到序列中最大元素并将它与序列中最后一个元素交换,然后找下一个最大元素并与倒数第二个元素交换,依次类推。此排序很简单,这不做多说,代码实现如下:View Code 1 void selectionSort(int data[],size_t n) 2 { 3 size_t i,j; 4 size_t MaxValIndex; 5 int largest; 6 if (0==n) 7 { 8 cout<<"Don't exist dat... 阅读全文
posted @ 2011-11-08 22:39 Trony 阅读(7745) 评论(0) 推荐(0) 编辑