- 博客(51)
- 收藏
- 关注
原创 递归与迭代
在我接受到的教育中,递归似乎是一个很神秘的东西。它难以说清,是高级货,像一团迷雾。在高中课外学习的过程中,我一开始没有理解到什么是递归,老师也可能觉得我们比较难以理解,所以后来就没有统一说说。而我也觉得貌似挺难的,也貌似不用也可以,所以就没了回事。后来到了大学,教编程语言的老师居然极度忽视递归,那时的我已经知道递归的重要性,她竟然说了些站不住脚的观点就糊弄过去,说白了,很多都是语法糖衣。
2013-08-09 10:43:53
942
原创 线段树_单点更新
最近开始接触线段树的内容,我发现线段树非常灵活和强大,很多问题都可以用线段树来做。但是,对于初次接触的人来说,可能比较难。根据大牛的博客,我开始一步步练习。现在把已经做好的单点更新的习题贴出来,讲讲自己的想法。欢迎拍砖~补充几点说明:(1)我采用静态方法构建线段树,即用数组来做,左子树为 2*i,右子树为 2*i+1。按照保守估计,数组空间一般开N*4,用到的空间实质上是N*2-1
2012-12-04 18:38:19
4490
2
原创 ZOJ 1649.Rescue
需要在监狱里营救出天使,监狱里有若干个狱卒,干掉狱卒需要消耗1回合。特别注意营救者可能不止一个。因为干掉狱卒需要多消耗1回合,所以用简单的队列出来的不一定就是最优结果,所以要用到优先队列。BFS与优先队列的应用。#include#include#includeusing namespace std;int **Prison;int n,m;int move[4][2] =
2012-10-20 22:23:55
856
原创 ZOJ 1438.Asteroids!
三维迷宫,简单BFS#include#include#includeusing namespace std;struct Point{ int x; int y; int z; int steps;}start,end; //起点与终点int n; //层数char ***space
2012-10-20 22:12:29
642
原创 ZOJ 1406.Jungle Roads
给出所有村庄的所有通路,找出一条连接所有村庄花费最小的通路。最小生成树的应用。此处用的是Prim算法。#include#includeusing namespace std;struct Graph{ //图邻接矩阵 char data; int key; int *adjacency;}*G;int n; //村庄数量int
2012-10-20 22:08:59
845
原创 ZOJ 1204.Additive equations
给出一个整数集合,判断是否能用集合里的元素构造加法等式,若能则输出按顺序输出所有等式。简单DFS()应用。/*ZOJ 1204 Additive equationsSample Input33 1 2 33 1 2 56 1 2 3 5 4 6Output for the Sample Input1+2=3Can't find any equations.1+2=
2012-10-20 21:59:01
1972
原创 ZOJ 1091.Knight Moves
国际象棋的马移动,分别向八个方向作广度优先搜索,找到最小步数。BFS()简单应用。#include#include#includeusing namespace std;struct Point{ //点 int x; int y;};struct QP{ //从开始到这点所需步数 Point p; int move;};bo
2012-10-20 21:52:26
750
原创 经典迷宫问题DFS
给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可以用1将迷宫围起来避免边界问题。本题采用DFS算法给出解。/*迷宫问题(八方向)input:16 80 1 1 1 0 1 1 11 0 1 0 1 0 1 00 1 0 0 1
2012-10-14 14:53:00
8623
4
原创 经典迷宫问题BFS
给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可以用1将迷宫围起来避免边界问题。本题采用BFS算法给出解。注意,利用BFS算法给出的路径必然是一条最短路径。/*迷宫问题(八方向)input:16 80 1 1 1 0 1 1 1
2012-10-14 14:49:47
28778
2
原创 广度优先搜索BFS——图邻接矩阵表示
这个是基于邻接矩阵的BFS图算法。/*图邻接矩阵表示DFSinput:17A 0 0 0 0 1 0 0B 0 0 1 1 0 0 0C 0 1 0 1 0 0 0D 0 1 0 0 1 1 0E 1 0 0 1 0 0 1F 0 0 0 1 0 0 0G 0 0 0 0 1 0 0output:A E D G B F C*/#include#include#
2012-10-07 15:22:44
3682
原创 广度优先搜索BFS——图邻接表表示
BFS是图的另一个重要算法,下面是基于邻接表表示的BFS算法。/*图邻接表表示BFSinput:17A 1 5B 2 4 3C 2 4 2D 3 6 5 2E 3 7 4 1F 1 4G 1 5output:A E D G B F C*/#include#include#includeusing namespace std;struct LinkNode{
2012-10-07 15:21:20
3106
原创 深度优先搜索DFS——图邻接矩阵表示
同样的DFS,这个是用邻接矩阵保存的图,或许应用没有那么广,要浪费较多的空间,但是还是有必要实现一下的,和之前那个算法的思想是一样的,只是变换了存储结构。/*图邻接矩阵表示DFSinput:17A 0 0 0 0 1 0 0B 0 0 1 1 0 0 0C 0 1 0 1 0 0 0D 0 1 0 0 1 1 0E 1 0 0 1 0 0 1F 0 0 0 1 0 0 0
2012-10-07 12:44:00
5013
1
原创 深度优先搜索DFS——图邻接表表示
作为图的一个基本算法,DFS应用很广,可以推广出很多实用的算法。下面贴出一个比较常用的用邻接表表示的图DFS。/*图邻接表表示DFSinput:17A 1 5B 2 4 3C 2 4 2D 3 6 5 2E 3 7 4 1F 1 4G 1 5output:A E D B C F G(运用递归实现)A E G D F B C(运用栈实现
2012-10-07 12:26:10
5048
原创 二叉树层次遍历
/*二叉树的层次遍历input:210 5 4 -1 -1 -1 20 19 -1 -1 40 -1 -130 10 8 20 -1 -1 -1 -1 50 40 -1 45 -1 -1 -1output:10 5 20 4 19 4030 10 50 8 40 20 45*/#include#includeusing namespace std;struct BTree
2012-10-04 21:05:32
1911
原创 二叉树后序遍历
分别用了三种不同的方法实现了二叉树的后序遍历。/*input:210 5 4 -1 -1 -1 20 19 -1 -1 40 -1 -130 10 8 20 -1 -1 -1 -1 50 40 -1 45 -1 -1 -1output:4 5 19 40 20 1020 8 10 45 40 50 30*/#include#includeusing namespace s
2012-10-04 18:52:55
1019
原创 二叉树中序遍历
分别用了三种不同的方法实现了二叉树的中序遍历。/*input:210 5 4 -1 -1 -1 20 19 -1 -1 40 -1 -130 10 8 20 -1 -1 -1 -1 50 40 -1 45 -1 -1 -1output:4 5 10 19 20 4020 8 10 30 40 45 50*/#include#includeusing namespace s
2012-10-04 18:51:59
3901
原创 二叉树前序遍历
分别用了三种不同的方法实现了二叉树的前序遍历。#include#includeusing namespace std;struct BTreeNode{ //二叉树 int data; BTreeNode *lchild; BTreeNode *rchild; BTreeNode *parent;};/*void PreOrder(BTree
2012-10-04 18:50:15
2088
原创 二叉搜索树
之前在学二叉搜索树的相关知识,今天我自己把有讲的没讲的都实现了一遍,的确有点收获~#includeusing namespace std;struct BTreeNode{ //二叉搜索树 int data; BTreeNode *parent; BTreeNode *lchild; BTreeNode *rchild;};
2012-10-03 21:35:21
733
原创 一个眼神
我现在还记得前两天搭地铁的时候,那个同龄人的眼神。 那是一个外地人,二十多岁,估计是和父母一起来到广州这打工。头发白白的,那只是灰;手黑黑的,那只是脏;面容不算特别地有神,那只是累。地铁还是一贯拥挤,我恰巧就站在他前面。或许是年龄相近的缘故,我们互相打量着对方,然后我发觉他怔怔地看着我,我不自觉也看着他。我从他的眼神里看出了一些东西,有疑惑,有迷茫,有羡慕,还有一些我看不懂的。
2012-07-07 22:12:31
836
原创 比赛+项目==大学?
上周体育老师说:“下周要考试了!”我才想起,原来这么快就到16周了,这个学期又差不多过去了。太快了,我有种错觉好像才刚刚开始呢!最近都貌似很忙,忙到没有时间停下来思考了(好吧...我承认我一直在想些有的没的)。 最近的一段时间,一直充斥着各种比赛。最高记录是两周五场ACM选拔赛(也就是接近20小时),估计我是比怕了,所以就好好想一想,这其实有没有必要。说实话,我不是那种
2012-06-05 00:10:48
2164
3
原创 鸡尾酒排序
鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。 #includevoid cocktail_sort(int A[],int n){ int i,j,temp; bool flag; for(i
2012-05-15 08:51:48
705
原创 康托尔展开
所谓康托尔展开就是形如 a[n]*n!+a[n-1]*(n-1)!+...+a[2]*2!+a[1]*1!的和,其中a[i]为整数,且0本算法不保存系数为0的阶乘,这样可能更直观。 #includestruct kte//保存阶乘及其系数{ int x; int jc;
2012-05-14 22:33:07
2448
原创 同余幂
#includeint Bnum(int A[],int b)//求b的二进制展开{ int i=0; while(b!=0) { A[i++]=b%2; b/=2; } return i;}int modR(int A[],int len,int m,int a)//求a^b mod m{ int i,result=1; int pow
2012-05-14 21:51:22
758
原创 计算中缀表达式(实数,四则运算与括号)(双栈)
之前写过这方面的算法,用的思想是先将中缀表达式转化为后缀表达式,再计算。本文采用直接计算中缀表达式的方法,用两个栈分别保存,运算符和数值。另外在处理括号问题时,抛开之前增大优先级的繁琐方法,直接把括号当做一条新的式子,计算后返回一个值到原式,这也算是递归思想。最后,此次把数据域扩充到实数域。 瑕疵:代码没有考虑除以0和一些不符合的情况,即输入的式子都是符合运算法则的。因为只是想体现
2012-05-11 17:55:17
4815
3
原创 UVa 537 - Artificial Intelligence?
大意:给出一道物理题关于公式P=UI,提取其中的关键信息并给出结果。其中关键信息只包含UIPMmkVAW.=和数值等符号,如P=2.34MW,结果保留两位小数。具体看输入输出例子。Sample Input3If the voltage is U=200V and the current is I=4.5A, which power is generated?A light-bulb
2012-05-09 11:37:41
1119
原创 UVa 10361 - Automatic Poetry
InputThe input will begin with a line containing a single number n. After this line follow n pairs of lines containing Schuttelreims. The first line of each pair will be of the forms12>s34>s5
2012-05-08 22:47:28
657
原创 UVa 10010 - Where's Waldorf?
大意:给出m*n个字母,大小写都有,给出k个单词,找出单词在字母堆中单词首字母的位置,已知单词必定在字母堆中找到。单词方向可以是八个方向。 分析:首先做一个预处理,把字母全部变为大写,这样容易判断。然后枚举字母堆的字母,只要找到和单词首字母相同的,就八个方向都搜一次,看是否为该单词。 我一开始写出来WA了,后来仔细看,原来要在每两组数据中输出一个空行。国内的OJ如果输少空行或空格一
2012-05-08 21:34:31
1672
原创 判断几代同堂
有一个大家族,给出双亲与孩子之间的关系,计算该家族为几代同堂如:输入:3 1 2 33 4 5 62 7 8000000(这个表示族长有3个孩子分别是1,2和3,1有3个孩子,分别是4,5和6,2有2个孩子,分别是7和8,3~8没有孩子)输出:3 分析:简单队列题。除了族长外,每个人都有父辈(这里忽略族长的父辈),把族长外
2012-04-22 23:02:18
1385
原创 求有限表中元素的最大值
设有一个表L=(a1,a2,a3,……,an),其中L为表名,a1,a2,a3,……,an为表中元素,但ai为数值时,表示一个元素值;当ai为大写字母时,表示另一个表,但不能循环定义。输入:L 3,4,8,S,9,0,8,TS 10,3,4,U,9,6T 4,5,6U 7,9,8,6输出:10 分析:水题。老师出题的本意是为了引入队列(queue),但我觉得在这
2012-04-22 22:52:48
711
原创 ZOJ 1423_(Your)((Term)((Project)))
大意:输入若干条式子,其中包含一些多余的括号(但全部都符合前配后)和空格,不改变运算符,输出没有多余括号和空格的式子。 分析:主要考虑五种情况:1、整个式子在括号内,要忽略括号;2、'+'后的括号要忽略;3、'-'后的括号要保留;4、(A)这样的括号要忽略;5、同时多个括号叠加要忽略,如((()))。考虑到情况比较多而复杂,我先做大概处理,然后再单独处理(A)这样的情况。注意用栈做好括号的
2012-04-22 22:40:20
1456
原创 ZOJ 1259_Rails
典型的栈题。大意:火车从A到B要经过中转站,已知进入序列是顺序的即1~n,给定目标序列,看是否能得到。已知火车进站后不能回到A。 分析:很明显用到栈。用count的递增变化来模拟进入序列,用target[]来保存目标序列。 #include#includeusing namespace std;int main(){ int n,i,count; int
2012-04-21 23:23:32
2189
原创 ZOJ 1094_Matrix Chain Multiplication
大意:输入一系列矩阵(不超过26个),判断下面输入的矩阵乘法是否合法(即是否满足前者的列等于后者的行),若合法则输出其做了多次数的乘法运算(若有两矩阵A:a,b; B: b,c ,则其做的数乘法次数为a*b*c),若不合法,则输出error。 分析:为了操作方便定义一个矩阵结构,保存矩阵名,row和column. 从题意可知,每次的乘法都用括号隔开,那么这里就符合LIFO。前括号可以忽略,
2012-04-21 23:18:09
1783
原创 UVa 401 - Palindromes
大意:判断输入的字符串是否为回文串和“镜像串”(不知道怎么翻译,一个字母的补由题目给出,如下)A list of all valid characters and their reverses is as follows. CharacterReverseCharacterReverseCharacterReverseAA
2012-04-21 23:08:56
1274
原创 计算后缀表达式
补发一篇计算后缀表达式,便于查看。#include#includeusing namespace std;int main(){ char s[100]; int temp,result,a,b,i; stack sk; while(cin.getline(s,100)) { for(i=0;s[i]!='\0';i++) { if(s[
2012-04-21 22:58:01
649
原创 457 - Linear Cellular Automata
这题难在题意。比较难懂。英语啊! 大意:40个培养基,起始状态除了20号为1外,其他全部为0。已知一个培养基是会影响隔壁两个培养基的,假设1号左边无穷远处有一个培养基为0,,40号右边无穷远处也有一个培养基为0。给出一个DNA序列,元素均不大于3.求50天培养基的变化。每天某个培养基的变化是 x=a[j-1]+a[j]+a[j+1], DNA[x]. 每过一天培养基变化为DNA[x].用
2012-04-18 13:39:59
953
原创 694 - The Collatz Sequence
Step 1: Choose an arbitrary positive integer A as the first item in the sequence.Step 2: If A = 1 then stop. Step 3: If A is even, then replace A by A / 2 and go to step 2.Step 4: If A is odd, the
2012-04-18 13:26:19
620
原创 489 - Hangman Judge
大意:猜单词。给出一个单词(选手不可见),选手猜单词的字母,若一个单词有多个相同字母则猜中一次就显示这些字母。猜错7次为输,在此之前若把单词的所有字母都猜中则为赢,既没有赢又没有输,即放弃。多次猜错同一个字母记为猜错一次。 思路:分别用两个数组记录给定的单词和选手猜的字母。记录给定单词有效字母的个数(不重复),用一个数组标识已给定的字母。然后用猜的字母逐个比较,分别记录猜错和猜中。
2012-04-18 13:22:55
1113
原创 计算n阶行列式
之前被Binto点名做这题了,简单做了一下,主要体现核心算法。算法也很普通,按照一般方法来做。思路:把行列式化为上三角,再计算斜边上元素之积。 分析:单纯地化上三角是不行的,要考虑到斜边上的元素有可能为0.所以,在做每一列之前,都要先检查斜边上的元素是否为0,若是,则往下找非0行再交换正行。此为一个函数。而计算的时候倒是相当简单。就是保存当前行首非0元素与那个斜边元素的倍数,接着
2012-04-16 09:51:47
4574
原创 过渡
昨天的校赛以想不到的方式结束了,正式加入了嵌入式研发组了。 下午的校赛,既有本校的人,也邀请了其他学校的队伍,不过我想应该都是大一的。康宁也过来了,哈哈,很久没有参加同一个比赛。可惜省赛我要缺席了,因为各种原因。上一个比赛应该是高三开始那时了。在今次校赛之前,我还在想怎样怎样可以A掉几题,可惜现实何等残酷。看着第一题硬着头皮编了一下,超时了。果然数据没那么弱。然后我不懂优化的
2012-04-15 08:51:51
502
原创 UVA 488 - Triangle Wave
简单题。没什么好说的。看好题目。注意空格和换行就好。 #includeusing namespace std;void print_wave(int n){ int i,j; for(i=1;i<=n;i++) { for(j=1;j<=i;j++) { cout<<i;
2012-04-12 22:12:22
2011
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人