- 博客(30)
- 收藏
- 关注
原创 n皇后问题递归回溯法
#include<stdio.h>int a[100]={0};int n;int cnt=0;bool check(int x,int y)//检查坐标为(x,y)是否可以放置皇后,即是否与前面的皇后有冲突 { for(int i=1;i<x;i++)//对前x-1行进行检查看在(x,y)的列和对角线是否存在皇后 { if(a[i]==y) return false; if(a[i]+i==x+y) return false; if(a[i]-i==y-x
2022-04-08 16:46:25
157
原创 合并排序分治思想
#include<stdio.h>void merging(int a[],int b[],int len_a,int len_b){ int c[len_a+len_b]; int i,j,k; i=j=k=0; while(i<len_a&&j<len_b) { if(a[i]<b[j]) c[k++]=a[i++]; else c[k++]=b[j++]; } while(i<len_a) c[k++
2022-03-25 21:41:42
1566
原创 活动安排问题贪心算法
#include<stdio.h>struct Active { int size;//活动序号 int start;//开始时间 int end;//结束时间 int state;//状态};void select(Active a[], int n){ for (int i = 0; i < n - 1; i++)//冒泡排序按照结束时间从早到晚 for (int j = 0; j < n - i - 1; j++) { if (a[j + 1
2022-03-24 22:30:38
431
原创 最大子序列和动态规划
#include<stdio.h>void Maxsum(int a[],int n){ int sum=0,b=0; int start=0,end=0; for(int i=0;i<n;i++) { if(b<0)//b代表的是0-i-1内的任意元素到i-1的最大子序列和 { b=a[i];//若到i-1的最大子序列和为负数,则到i的最大子序列和为i本身值较大 start=i; } else b=b+a[i]; if(b>sum) {
2022-03-14 10:20:07
1074
原创 最大子序列问题递归与动态规划
#include<stdio.h>#include<stdlib.h>int Lcs(int n,int m,int a[], int b[], int c[100][100]){ if (n== 0 || m == 0) return 0; if (a[n] == b[m]) { return Lcs(n - 1, m - 1, a, b, c) + 1; } else return Lcs(n - 1, m, a, b, c) &..
2022-03-12 17:08:31
1223
原创 KMP算法-next数组
#include<stdio.h>#include<stdlib.h>#include<string.h>void getNext(char T[], int next[]){ int i = 0; int j = -1; next[0] = -1; while (i < strlen(T)) { if (j==-1||T[i] == T[j]) { i++; j++; next[i] = j; } else
2022-03-03 15:39:13
89
原创 字符串倒序输出
倒序拷贝到另一个字符数组#include <stdio.h>#include <string.h> int main(void){ char strinput[100]; scanf("%[^\n]", strinput); //除了换行符以外的字符全部接收 char stroutput[100];//用来存放倒序字符串 int i = 0; int j = 0; int len = strlen(strinput);
2022-01-05 21:24:43
505
原创 C语言实现的通讯录
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>//#define _CRT_SECURE_NO_WARNINGSstruct person{ char num[20]; //手机号 char name[20]; //姓名 char email[20]; //邮箱 char address[50]; //地址};int menu()/
2021-12-24 15:38:18
299
原创 堆排序(构建大根堆)
#include<stdio.h>//这个算法的思路是将一棵完全二叉树从根开始从1-n编号,其结点数据域对应着数组的1-n元素的值void sift(int a[], int k, int end)//调整函数,k为调整开始结点,end为结点总数{ int i = k;//若调整层数比较浅的结点则也需要调整与其父节点互换孩子为根节点的子树 int j = 2 * i;//指向左孩子 while (j <= end)//判断是否为叶子结点 { if (j < end&
2021-12-06 16:37:00
392
原创 选择排序,没什么好说的凑字数
#include<stdio.h>void selectsort(int a[], int n){for (int i = 0; i < n - 1; i ++){//int min = i;for (int j = i + 1; j < n; j++){ if (a[i] > a[j]) { int temp=a[i]; a[i] = a[j]; a[j] = temp; } }}}int main(){int
2021-12-05 22:10:36
215
原创 快速排序(含有递归)算法
#include <stdio.h>int partition(int a[], int first, int end)//划分函数,返回轴值{ int i = first; int j = end; while (i < j)// { while (i < j&&a[j] > a[i])//从轴值右边找到一个比轴值大的元素 j--; if (i < j)//这个值应该在轴值的右边 { int temp = a[i]
2021-12-05 21:57:25
253
原创 哈夫曼树的创建和哈夫曼编码
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<limits.h>#include<string.h>//int n1 = 0, n2 = 0;#pragma warning(disable:4996)struct Huffunode//定义哈夫曼树结点{ int weight; int parent; int lchild; int rchild;
2021-12-02 20:03:32
1013
原创 01背包问题
#include<stdio.h>#include<stdlib.h>#include<string.h>struct Nature{ int v; int w; int s;};int max(int a, int b){ return a > b ? a : b;}int main(){ int N, V; scanf_s("%d %d", &N,&V); Nature a[1000]; for (int
2021-11-30 14:24:51
97
原创 01背包问题个人想法代码(部分数据结果不准确)
#include<stdio.h>struct Nature{ int v; int w; int s;};void bubblesort(Nature a[], int n){ Nature temp; for (int j = n - 1; j > 0; j--)//控制比较的最右端下标 for (int i = 0; i < j; i++)//执行冒泡比较 { if ((double)(a[i].w/a[i].v) <(double)(
2021-11-29 23:11:17
65
原创 冒泡排序算法实现
#include<stdio.h>void bubblesort(int a[], int n){ int temp; for(int j=n-1;j>0;j--)//控制比较的最右端下标 for (int i = 0; i < j; i++)//执行冒泡比较 { if (a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } }
2021-11-25 17:11:46
167
原创 希尔排序算法实现
```c#include<stdio.h>#include<stdlib.h>void Shellsort(int r[], int n){ for (int d = n / 3; d >= 1; )//增量d一般取n/2,这个是作业要求取n/3 { for (int i = d + 1; i <= n; i++) { r[0] = r[i];//r[0]作为临时保存比较元素作用 int j = i - d;//j初始取指向比较元素的.
2021-11-24 12:13:55
384
原创 二分查找算法
#include<stdio.h>#include<stdlib.h>int main(){ int array[] = { 1,4,7,9,22,56,89,122,234,556,789 }; int length = sizeof(array) / sizeof(array[0]); int index = -1,mid; int low = 0, high = length - 1; int target = 122; while (low <= h
2021-11-23 20:55:32
858
原创 二叉树的结点删除算法实现
//二叉排序树//可以用来排序#include<stdio.h>#include<stdlib.h>//定义树节点struct Binode{ int data; Binode* lchild; Binode* rchild;};//插入函数构建void BSTinsert(Binode* &root, int key)//指针引用可修改指针的值,否则智能修改指针所指的值{ if (root == NULL) { root = (Binode
2021-11-21 15:15:02
345
原创 二叉排序树的查找递归算法实现
//二叉排序树//可以用来排序#include<stdio.h>#include<stdlib.h>//定义树节点struct Binode{ int data; Binode* lchild; Binode* rchild;};//插入函数构建void BSTinsert(Binode* &root, int key)//指针引用可修改指针的值,否则智能修改指针所指的值{ if (root == NULL) { root = (Binode
2021-11-19 20:42:53
4156
原创 递归、非递归的深度优先遍历算法实现
#include<stdio.h>#include<string.h>#include<stdlib.h>struct Arcnode { int adjvex; Arcnode* next;};struct Vertexnode { char vertex; Arcnode* first;};const int MAX_VERTEX = 10;Vertexnode adjlist[MAX_VERTEX];void Creategraph(
2021-11-19 19:21:18
861
原创 基于邻接矩阵的广度优先遍历算法实现
#include<stdio.h>#include<string.h>#include<stdlib.h>struct Mgraph { int visit[100]; int matrix[100][100]; char vertex[100]; int n, e;};void Create(Mgraph& g,char a[], int n,int e){ g.visit[100] = { 0 }; g.e = e; g.n =
2021-11-19 19:19:11
1276
原创 二叉树的前中后递归与非递归遍历算法实现
(1) 二叉树的前序遍历程序,包含递归、非递归。(2) 二叉树的中序遍历程序,包含递归、非递归。(3) 二叉树的后序遍历程序,包含递归、非递归。代码如下#include <stdio.h>#include <stdlib.h>// 定义节点typedef struct Node { char data; struct Node* lChild; struct Node* rChild;} BinTNode;// 根据广义表表示二叉树结构来创建二叉树链表
2021-11-19 19:16:20
140
原创 二叉排序树的算法实现
//二叉排序树//可以用来排序#include<stdio.h>#include<stdlib.h>//定义树节点struct Binode{ int data; Binode* lchild; Binode* rchild;};//插入函数构建void BSTinsert(Binode* &root, int key)//指针引用可修改指针的值,否则智能修改指针所指的值{ if (root == NULL) { root = (Binode
2021-11-19 19:12:35
232
原创 拓扑排序算法的实现
//拓扑排序算法#include<stdio.h>#include<string.h>#include<stdlib.h>//定义边表结构struct Arcnode { int adjvex; Arcnode* next;};//定义顶点表结构struct Vertexnode { int in; char vertex; Arcnode* first;};//定义图结构struct Graph{ Vertexnode adjlist
2021-11-19 12:33:44
416
原创 最短路径(Dijskra算法实现,迪杰斯特拉算法
```c#include<stdio.h>#include<limits.h>#define INF 0x3f3f3f3fconst int MAX_VERNUM=100;//定义图结构,包括邻接矩阵和顶点信息数组,边和顶点数量struct Graph { int matrix[100][100]; char vertex[100]; int vernum, edgenum;};//初始化图void Creategraph(Graph &g, cha.
2021-11-18 19:49:33
455
原创 网图的最小生成树prim(普利姆)算法
#include<stdio.h>#include<limits.h>#define INF 0x3f3f3f3f//定义辅助表类型struct Nodetype { int adjvex; int lowcost;};//定义图结构,包括邻接矩阵和顶点信息数组,边和顶点数量struct Graph { int matrix[100][100]; char vertex[100]; int vernum, edgenum;};//初始化图void Cre
2021-11-16 21:17:20
85
原创 网图的最小生成树prim(普利姆)算法
#include<stdio.h>#include<limits.h>#define INF 0x3f3f3f3f//定义辅助表类型struct Nodetype {int adjvex;int lowcost;};//定义图结构,包括邻接矩阵和顶点信息数组,边和顶点数量struct Graph {int matrix[100][100];char vertex[100];int vernum, edgenum;};//初始化图void Creategr
2021-11-16 21:02:57
521
原创 图的最小生成树克鲁斯卡尔(kruskal)算法
#include<stdio.h>//构造边的数据类型,包括起点终点权值struct Edgetype {int from;int to;int weight;};//少用宏定义const int MAXvertex = 10;const int MAXedge = 100;//构造图的结构体,包括用来储存顶点信息的数组ver和边信息的表数组edgetablestruct Graph {char ver[MAXvertex];Edgetype edgetable[MA
2021-11-15 21:55:53
467
原创 有向图邻接表的递归非递归深度优先遍历
#include<stdio.h>#include<string.h>#include<stdlib.h>struct Arcnode {int adjvex;Arcnode* next;};struct Vertexnode {char vertex;Arcnode* first;};const int MAX_VERTEX = 10;Vertexnode adjlist[MAX_VERTEX];void Creategraph(char a[
2021-11-10 20:28:19
1277
原创 以汉诺塔为例的递归心得
对于递归不要去具体想象它的运作过程,要不然会绕晕编写代码的步骤大概是先找出临界条件和临界操作然后找出循环的操作是什么,可以试着倒数第二(n-1)到最后一个(n)去探索。递归往往把前面的当作一个整体,然后对下一个个体进行操作,例如汉诺塔就是把1到n-1当做一个整体然后与第n个进行操作,这样可以起到简化的作用,对于前面的1到n-1的整体,又可以由1-n-2组成的整体和n-1进行操作,就这样一直传递到1,触发临界条件操作,然后进行归的操作(出栈)附上代码void hanoi(int n,char A,
2021-10-27 22:11:53
285
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人