
数据结构 && ACM
It_Ds_N_cpp
这个作者很懒,什么都没留下…
展开
-
ACM:图的BFS,走迷宫
题目:一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0来表示)。你的任务是找一条从起点到终点的最短移动序列,其中UDLR分别表示往上、下、左、右移动到相邻单元格。任何时候都不能在障碍格中,也不能走到迷宫之外。起点和终点保证是空地。分析:图的BFS。#include #include #include using namesp原创 2014-06-23 21:48:26 · 2602 阅读 · 1 评论 -
ACM:回溯法,子集生成
(一)增量构造法#include #include using namespace std;const int MAXN = 1000;int A[MAXN], n;void print_subset(int n, int *A, int cur) { for(int i = 0; i < cur; ++i) cout << A[i] << " "; cout << endl原创 2014-07-03 20:45:02 · 1135 阅读 · 0 评论 -
ACM:树的变换,无根树转有根树
题目:输入一个n个节点的无根树的各条边,并指定一个根节点,要求把该树转化为有根树,输出各个节点的父亲编号。分析:分析在代码的注释中!#include #include using namespace std;const int MAXN = 1000;int n, p[MAXN];vector G[MAXN];void dfs(int u, int fa原创 2014-06-27 16:52:20 · 3771 阅读 · 0 评论 -
ACM:树的变换,根据表达式建立表达式树
题目:输入一个表达式,建立一个表达式树!分析:找到最后计算的运算符(它是整棵表达式树的根),然后递归处理! 在代码中,只有当p==0的时候,才考虑这个运算符,因为括号里的运算符一定不是最后计算的,应当忽略! 由于加减跟乘除都是左结合的,最后一个运算符才是最后计算的,所以用两个变量c1跟c2分别记录在括号外面的“最右”出现的加减号和乘除号。原创 2014-06-27 18:09:14 · 1521 阅读 · 0 评论 -
数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)
代码注释比较详细:#include #include using namespace std;struct Node{ int data; Node* next;};Node* head = NULL;bool create() { head = (Node*)malloc(sizeof(Node)); if(NULL == head) return false;原创 2014-07-06 20:05:08 · 1148 阅读 · 0 评论 -
ACM:动态规划,01背包问题
题目:有n件物品和一个容量为C的背包。(每种物品均只有一件)第i件物品的体积是v[i],重量是w[i]。选一些物品装到这个背包中,使得背包内物品在总体积不超过C的前提下重量尽量大。解法:两种思路:第一种:d(i, j)表示“把第i,i+1,i+2,...n个物品装到容量为j的背包中的接下来的最大总重量”。 d(i, j) = max{d(i+1, j),原创 2014-06-19 11:09:27 · 1836 阅读 · 0 评论 -
ACM:图的DFS,黑白图像
题目:输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。输入:第一行输入一个整数n(n输出:输出有多少个八连块,以及每个块的面积。一个方格的面积为1。分析:把图片最外层扩展开来,在最外面加一层白色的框框。。设置一个数组来存储每个八连块的面积。。DFS递归调用每一个黑色的方块。。DFS的最原创 2014-06-22 22:36:10 · 1632 阅读 · 0 评论 -
数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。
按先序遍历创建一棵树,以层次遍历输出样例输入A B # D # # C E # # F # #样例输出LevelOrder: A B C D E F 代码:#include #include using namespace std;struct node { //表示一个树上的节点 char ch; nod原创 2014-06-08 12:37:49 · 3945 阅读 · 0 评论 -
ACM:贪心法:乘船问题。
题目:有n个人,第i个人的重量为wi,每艘船的最大载重量均为C,且最多只能乘两个人。用最少的船装载所有人。分析:贪心法! 考虑最轻的人i,他应该和谁一起坐呢?如果每个人都无法和他一起坐船,那么唯一的方案就是每个人坐一艘船! 否则,他应该选择能和他一起坐船的人中最重的一个j。 这样的方法是贪心的!因为:它只是让“眼前”的浪费原创 2014-06-11 21:54:56 · 2878 阅读 · 0 评论 -
数据结构 && ACM :比较两棵树是否相等。
题目:有如下数据结构:typedef struct TreeNode{ char c; TreeNode *leftChild; TreeNode *rightChild;};现在实现函数:int CompTree(TreeNode *tree1, TreeNode *tree2); 比较两棵树是否相等代码:typedef struct TreeNode{原创 2015-01-17 10:21:36 · 1504 阅读 · 0 评论 -
字符串高频面试题。
(一)题目:把一个01(只包含0和1的串)串进行排序。 可以交换任意两个位置,求最少交换的次数。方法:仿造快速排序里面的partition的过程。。。最左边的0和1是没有意义的,从左到右扫到第一个1,从右到左扫到第一个0,然后交换,然后继续扫下去,就ok啦。。代码:#include #include #define MAXN 1000using namespace st原创 2015-04-23 10:21:28 · 726 阅读 · 0 评论 -
在由N个正整数的集合S中,找出最大元素M,满足M=A + B,其中A,B都是集合S中元素
思路:先对集合排序,时间复杂度nlogn,再把M从最大值开始遍历,A和B分别取小于M的最小值和最大值,测试A+B是否等于M,如果小则A右移,如果大则B左移。总的时间负责度为n*nint find(int S[], int n){ sort(S, S + n); for(int i = n - 1; i >=2; --i){ int left = 0, right = i - 1原创 2015-08-28 21:30:11 · 1074 阅读 · 0 评论 -
ACM:回溯法,八皇后问题,素数环
(一)八皇后问题(1)回溯法#include #include #define MAXN 100using namespace std;int tot = 0, n = 8;int C[MAXN];void search(int cur) { if(cur == n) ++tot; //递归边界,只要走到了这里,所有皇后必然不冲突 else for(in原创 2014-07-03 21:55:18 · 1939 阅读 · 0 评论 -
ACM:回溯法,枚举排列
(一)生成1~n的排列分析:用递归的思想解决:先输出所有以1开头的排列(这一步是递归调用),然后输出以2开头的排列(又是递归调用),接着是以3开头的排列......最后才是以n开头的排列。伪代码:void print_permutation(序列A, 集合S) {if(S为空) 输出序列A;else 按照从小到大的顺序依次考虑S的每个元素v {print_permutati原创 2014-07-02 22:57:05 · 1335 阅读 · 0 评论 -
ACM:动态规划,物品无限的背包问题(完全背包问题)
题目:有n种物品,每种物品都有无限件可用。第i种物品的体积是vi,重量是wi。选一些物品装到一个容量为C的背包中,使得背包内物品在总体积不超过C的前提下重量尽量大。分析,完全背包问题,相对于上上篇文章的硬币问题,只是由DAG上的无权图变成了这里的DAG上的带权图!输出最后满足体积不超过背包容量的条件下,背包中的最大重量。代码:#include #include using原创 2014-06-11 22:18:49 · 4207 阅读 · 1 评论 -
ACM:因子和阶层
题目:输入正整数n(2≤n≤100),把阶乘n!=1×2×3ׄ×n分解成素因子相乘的形式,从 小到大输出各个素数(2、3、5、„)的指数。例如825=3×52 ×11应表示成(0,1,2,0,1),表示分别有0、1、2、0、1个2、3、5、7、11。你的程序应忽略比最大素因子更大的素数(否则末尾会有无穷多个0)。 样例输入: 5 53 样例输出: 5!=3 1 1 53!=4原创 2014-06-07 12:43:20 · 877 阅读 · 0 评论 -
ACM:最小生成树,kruskal && prim,并查集
题目:输入顶点数目,边的数目,输入每条边的两个顶点编号还有每条边的权值,求最小生成树,输出最小生成树的权值。。注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图。kruskal----归并边;prim----归并点方法一:kruskal,克鲁斯卡尔原创 2014-06-27 22:05:29 · 1062 阅读 · 0 评论 -
数据结构:树的遍历!按先序遍历创建一棵树,分别以先序、中序、后序遍历输出
题目:树的遍历!按先序遍历创建一棵树,分别以先序、中序、后序遍历输出 样例输入A B # D # # C E # # F # #原创 2014-06-08 13:19:23 · 1976 阅读 · 0 评论 -
数据结构:图论:欧拉回路!一笔画问题
从无向图中的一个结点出发走出一条道路,每条边恰好经过一次。这样的路线称为欧拉道路。奇点的概念:一个点的度数为奇数的时候,这个点就称为:奇点。无向图中结论:不难发现,在欧拉道路中,除了起点跟终点,其他所有点的度数都应该是偶数!如果一个无向图是连通的,且最多只有两个奇点,则一定存在欧拉道路。如果有两个奇点,则必须从其中一个出发,然后从另外一个终止。如果不存在奇点,则可以从任意点原创 2014-06-09 14:47:43 · 2301 阅读 · 0 评论 -
ACM:DAG上的动态规划------嵌套矩形
题目:有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a原创 2014-06-06 17:27:25 · 768 阅读 · 0 评论 -
数据结构:图论:拓扑排序! 两种方法!
拓扑排序:(1)由偏序变成全序的过程!直观的说,偏序指集合中仅有部分成员之间可比较!而全序指集合中全体成员之间均可比较! (2)将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。数据结构中进行拓扑排序的方法:方法一:(1)在有向图中选一个没有前驱的顶点且输出之!(2)从图中删原创 2014-06-09 14:11:51 · 1227 阅读 · 0 评论 -
ACM:DAG上的动态规划------硬币问题
题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值!分析:我们把每种面值看作一个点!表示“还需要凑足的面值”,初始状态为S,目标状态为0。那么若当前状态在i,每使用一个硬币j,状态便转移到i-Vj。 代码:记忆化搜索:#include #include using n原创 2014-06-10 12:25:20 · 3314 阅读 · 2 评论 -
ACM:最短路,dijkstra,邻接表的建立,使用邻接表跟优先队列的dijkstra,Bellman-Ford,Floyd。。
(一)所有边权均为正,不管有没有环,原创 2014-06-30 22:17:03 · 2305 阅读 · 0 评论 -
ACM:递归与分治,最大连续和,O(n3), O(n2), O(nlogn), O(n) 算法。
题目,求一个连续的数组,最大连续和。(一)O(n3)算法:利用穷举法的思想,这种方法的效率最差。代码如下:#include #include #include #include using namespace std;const int MAXN = 1000;int A[MAXN], n;int maxsum(int *A, int n) { int beat原创 2014-07-01 22:22:04 · 2060 阅读 · 0 评论 -
ACM:归并排序,以及利用归并排序思想求解逆序对数!
(一)归并排序分析:(1)划分问题:把序列分成元素个数尽量相等的两半。(2)递归求解:把两半元素分别排序。(3)合并问题:把两个有序表合并成一个。(每次只需要把两个序列的最小元素加以比较,删除其中的较小元素并加入合并后的新表)#include using namespace std;const int MAXN = 1000;int A[MAXN], T[MAXN];原创 2014-07-01 23:16:48 · 937 阅读 · 0 评论 -
ACM:二分查找,以及利用二分法来找上下界
(一)二分的模版:int binary_search(int *array, int length, int key) { int start = 0, end = length - 1; while(end >= start) { int middle = start + (end - start) / 2; int tmp = array[middle]; if(tmp <原创 2014-07-01 23:22:06 · 1873 阅读 · 0 评论 -
查找数组中第二大的数字
#define ARRSIZE 10#define MINNUMBER 0xFFFFFFFF#define FIND_SUCESS 1#define FIND_FAIL 0int GetSecondMaxNumber(int buffer[],int *secondMax){ int i,max;原创 2015-08-28 16:37:06 · 1059 阅读 · 0 评论