![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础算法
Robin_just
这个作者很懒,什么都没留下…
展开
-
1.3快速排序
#include<iostream>using namespace std;int a[101],n;//定义全局变量,这两个变量需要在子函数中使用void quicksort(int left,int right){ int i,j,t,temp; if(left>right){ return; } temp=a[left];//temp中存的就原创 2017-05-20 19:12:59 · 188 阅读 · 0 评论 -
5.2最少转机——图的广度优先遍历
#include#includeusing namespace std;struct note{ int x;//城市编号 int s;//转机次数 };int main(){ struct note que[2501]; int e[51][51]={0},book[51]={0}; int head,tail; int i,j,n,m,a,b,cur,start,end原创 2017-03-14 13:38:42 · 670 阅读 · 0 评论 -
6.4Bellman-Ford的队列优化
#includeusing namespace std;int main(){ int n,m,i,j,k; int u[8],v[8],w[8];//u,v,w数组大小要根据实际情况来设置,要比m的最大值大1 int first[6],next[8]; //first数组表示各个顶点的第一条边的编号(重点就是它只是一个编号) //next数组表示"编号为i的边"的"下一条边"的编原创 2017-03-14 13:43:32 · 183 阅读 · 0 评论 -
6.3Bellman-Ford——解决负权边
#includeusing namespace std;int main(){ int dis[10],bak[10],i,k,n,m,u[10],v[10],w[10],check,flag;//bak数组用来备份数组dis int inf=99999999;//用inf(infinity的缩写)存储一个我们认为的无穷大值 cout<<"请输入顶点个数n和边的条数m:"<<en原创 2017-03-14 13:42:42 · 239 阅读 · 0 评论 -
6.2Dijkstra算法——通过边实现松弛
#includeusing namespace std;int main(){ int e[10][10],dis[10],book[10],i,j,n,m,b1,b2,z3,u,v,min;//book数组用来标记 int inf=99999999;//用inf(infinity的缩写)存储一个我们认为的无穷大值 cout<<"请输入顶点个数n和边的条数m:"<<endl;原创 2017-03-14 13:41:20 · 442 阅读 · 0 评论 -
6.1只有五行的算法——Floyd-Warshall
#include#includeusing namespace std;int main(){ int e[10][10],k,i,j,n,m,b1,b2,z3; int inf=99999999;//用inf(infinity的缩写)存储一个我们认为的无穷大值 cout<<"请输入顶点个数n和边的条数m:"<<endl; cin>>n>>m; //初始化 for(原创 2017-03-14 13:40:28 · 279 阅读 · 0 评论 -
5.1.2图的广度优先遍历
#include#includeusing namespace std;int book[101],sum,n,e[101][101];void dfs(int cur){//cur是当前所在的顶点编号 int i; cout<<cur<<" "; sum++;//每访问一个顶点,sum就加1 if(sum==n){ return;//所有的顶点都已经访问过则直接退出 }原创 2017-03-14 13:36:29 · 263 阅读 · 0 评论 -
5.1.1图的深度优先遍历
#include#includeusing namespace std;int book[101],sum,n,e[101][101];void dfs(int cur){//cur是当前所在的顶点编号 int i; cout<<cur<<" "; sum++;//每访问一个顶点,sum就加1 if(sum==n){ return;//所有的顶点都已经访问过则直接退出 }原创 2017-03-14 13:35:42 · 379 阅读 · 0 评论 -
4.5.3宝岛探险//DFSearch(又称着色法)
#includeusing namespace std;int a[51][51];int book[51][51],n,m,sum;void dfs(int x,int y){ //定义一个方向数组 int next[4][2]={{0,1},//向右走 {1,0},//向下走 {0,-1},//向左走 {-1,0}//向上走 }; int原创 2017-03-14 13:29:27 · 337 阅读 · 0 评论 -
4.5.4宝岛探险//着色法2
#include#includeusing namespace std;int a[51][51];int book[51][51],n,m,sum;void dfs(int x,int y,int color){ //定义一个方向数组 int next[4][2]={{0,1},//向右走 {1,0},//向下走 {0,-1},//向左走 {-原创 2017-03-14 13:30:21 · 352 阅读 · 0 评论 -
5.3城市地图——图的深度优先遍历
#include#includeusing namespace std;int Min=99999999,book[101],n,e[101][101];//book数组用来标记 //我们这里假设99999999为正无穷 //cur是当前所在的城市编号,dis是当前已经走过的路程void dfs(int cur,int dis){ int j; //如果当前走过的路程已经远大于之前原创 2017-03-14 13:38:50 · 511 阅读 · 0 评论 -
7.1堆——神奇的优先队列
#includeusing namespace std;int h[101];//用来存放堆的数组 int n;//用来存储堆中元素的个数,也就是堆的大小 //交换函数,用来交换堆中的两个元素的值 void swap(int x,int y){ int t; t=h[x]; h[x]=h[y]; h[y]=t;} //向下调整函数 void siftdown(int i原创 2017-03-14 22:09:17 · 240 阅读 · 0 评论 -
7.2擒贼先擒王——并查集
#includeusing namespace std;int f[1000]={0},n,m,k,sum=0;//初始化函数,数组里面存的是自己数组下标的编号void init(){ int i; for(i=1;i<=n;i++){ f[i]=i; } }//这里是找爹的递归函数,不停地去找爹(get father),知道找到祖宗为止//其实就是去找犯罪团伙的最原创 2017-03-14 22:09:54 · 372 阅读 · 0 评论 -
170423_巴斯卡三角形
#include<stdio.h>#define N 5//总共6行 long combi(int row, int location){ long position_value=1; for(int i=1;i<=location;i++){ position_value=position_value*(row-i+1)/i;//这里的规律是排列 }原创 2017-04-23 21:13:38 · 346 阅读 · 0 评论 -
通过河内之塔问题深入理解递归思想
#include<stdio.h>void hanoi(int n,char source,char temp,char target){ if(n==1){ printf("Move sheet %d from %c to %c\n",n,source,target); } else{ hanoi(n-1,source,target,tem原创 2017-04-23 20:42:04 · 999 阅读 · 0 评论 -
九宫重排问题
实验内容用A搜索算法实现重排九宫实验原理1).评价函数 以当前状态下各将牌到目标位置的距离之和作为节点的评价标准。距离的定义为:“某将牌行下标与目标位置行下标之差的绝对值 + 列下标与目标位置列下标之差的绝对值”。距离越小,该节点的效果越好。某个状态所有将牌到目标位置的距离之和用“h值”表示。2).主要函数(1).countH(state & st);countH函数功能是计算st状态的h值。原创 2017-04-26 14:30:27 · 3983 阅读 · 2 评论 -
8.5我要做月老——二分图最大匹配
#includeusing namespace std;int e[101][101],match[101],book[101],n,m;int dfs(int u){ int i; for(i=1;i<=n;i++){ if(book[i]==0&&e[u][i]==1){ book[i]=1;//标记点i已经访问过 if(match[i]==0||dfs(match[原创 2017-03-16 13:10:11 · 558 阅读 · 0 评论 -
8.4关键道路——图的割边
#includeusing namespace std;int n,m,e[9][9],root;int num[9],low[9],index;int min(int a,int b){ return a<b?a:b;}void dfs(int cur,int father){ int i,j; index++; num[cur]=index; low[cur]=index原创 2017-03-16 13:09:15 · 826 阅读 · 0 评论 -
8.3重要城市——图的割点
#includeusing namespace std;int n,m,e[9][9],root;int num[9],low[9],flag[9],index;//index用来进行时间戳的递增//求两个数中较小一个数的函数int min(int a,int b){ return a<b?a:b;} //割点算法的核心void dfs(int cur,int father){/原创 2017-03-14 22:13:06 · 484 阅读 · 0 评论 -
8.2.2再谈最小生成树//用数组
#includeusing namespace std;int main(){ int n,m,i,j,k,min,b1,b2,z3; int e[7][7],dis[7],book[7]={0};//这里对book数组进行了初始化 int inf=99999999; int count=0,sum=0;//count用来记录生成树中顶点的个数,sum用来存储路径之和 //读入n原创 2017-03-14 22:12:15 · 570 阅读 · 0 评论 -
8.2.1再谈最小生成树//用堆
#includeusing namespace std;int dis[7],book[7]={0};//book数组用来记录哪些顶点已经放入生成树中 int h[7],pos[7],size;//h用来保存堆,pos用来存储每个顶点在堆中的位置,size为堆的大小 //交换函数,用来交换堆中的两个元素的值 void swap(int x,int y){ int t; t=h[x]原创 2017-03-14 22:11:31 · 436 阅读 · 0 评论 -
8.1镖局运镖——图的最小生成树
#includeusing namespace std;struct edge{ int u; int v; int w;};//为了方便排序,这里创建了一个结构体用来存储边的关系struct edge e[10];//数组大小根据实际情况来设置,要比m的最大值大1int n,m;int f[7]={0},sum=0,count=0;//并查集需要用到的一些变量//f数组大小根原创 2017-03-14 22:10:35 · 762 阅读 · 0 评论 -
4.5.2宝岛探险//BFSearch
#includeusing namespace std;struct note{ int x;//横坐标 int y;//纵坐标};int main(){ struct note que[2501];//因为地图大小不超过20*20,因此队列扩展不会超过400个 int head,tail;//队列 int book[51][51]={0};//定义一个标记数组并全部初始化为0原创 2017-03-14 13:28:28 · 356 阅读 · 0 评论 -
4.6水管工游戏
#include#includeusing namespace std;int a[51][51];//假设徒弟的大小不超过50*50 int book[51][51],n,m,flag=0;struct note{ int x;//横坐标 int y;//纵坐标 }s[100];int top=0;void dfs(int x,int y,int front){ int i原创 2017-03-14 13:32:00 · 346 阅读 · 0 评论 -
4.5.1宝岛探险//Floodfill漫水填充法(也称种子填充法)——用于求图中独立子图的个数
#include#includeusing namespace std;int a[51][51];int book[51][51],n,m,sum;void dfs(int x,int y,int color){ //定义一个方向数组 int next[4][2]={{0,1},//向右走 {1,0},//向下走 {0,-1},//向左走 {-原创 2017-03-14 13:27:07 · 469 阅读 · 0 评论 -
2.4.1链表
#include#includeusing namespace std;//这里创建一个结构体用来表示链表的结点类型struct node{ int data; struct node *next;}; int main(){ struct node *head,*p,*q,*t; int i,n,number; cout<<"请输入当前链表有多少个元素n:"; ci原创 2017-03-13 22:18:11 · 157 阅读 · 0 评论 -
2.3纸牌游戏——小猫钓鱼
#includeusing namespace std;struct queue{ int data[1000]; int head; int tail;};struct stack{ int data[10]; int top;};int main(){ struct queue q1,q2; struct stack s; int book[10]; int i,原创 2017-03-13 22:17:15 · 992 阅读 · 0 评论 -
2.2解密回文——栈
/*判断一个字符串是否为回文字符串*/#include#includeusing namespace std;int main(){ char a[101],s[101]; int i,len,mid,next,top; gets(a);//读入一行字符串 len=strlen(a);//求字符串的长度 mid=len/2-1;//求字符串的中点 cout<<endl;原创 2017-03-13 22:16:24 · 434 阅读 · 0 评论 -
2.1.2队列——正式版(经过封装)
#includeusing namespace std;struct queue{ int data[100]; int head;//队首 int tail;//队尾 };int main(){ struct queue q; int i; q.head=q.tail=1;//初始化队列 cout<<"请依次输入加密过的数串:"; for(i=1;i<=9;i++){原创 2017-03-13 22:15:17 · 197 阅读 · 0 评论 -
2.1.1队列——雏形(初始版本)
/*情景描述:解密规则:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾......题目:给出一串已经加密过的一串数6,3,1,7,5,8,9,2,4。求出原来那串数*/#includeusing namespace std;int main(){ int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail原创 2017-03-13 22:14:01 · 442 阅读 · 0 评论 -
1.4.2冒泡法(先排序再去重)
#includeusing namespace std;int main(){ int a[101],n,i,j,t; cout<<"请输入共有多少本书,即n="; cin>>n; cout<<"请依次输入各本书的ISBN编号:"<<endl; for(i=1;i<=n;i++){ cin>>a[i]; }/*O(N)*/ //开始冒泡排序 for(i=1;i<=n-1原创 2017-03-13 22:12:42 · 754 阅读 · 0 评论 -
1.4.1桶排序法(先去重再排序)
#includeusing namespace std;int main(){ int a[1001],n,i,t;//M=1000 for(i=1;i<=1000;i++){ a[i]=0; } cout<<"请输入共有多少本书,即n="; cin>>n; cout<<"请依次输入各本书的ISBN编号:"<<endl; for(i=1;i<=n;i++){//循环读入n原创 2017-03-13 22:11:21 · 813 阅读 · 0 评论 -
1.3快速排序
#includeusing namespace std;int a[101],n;//定义全局变量,这两个变量需要在子函数中使用void quicksort(int left,int right){ int i,j,t,temp; if(left>right){ return; } temp=a[left];//temp中存的就是基准数 i=left; j=right;原创 2017-03-13 22:08:46 · 353 阅读 · 0 评论 -
1.2冒泡排序
#includeusing namespace std;struct student{ char name[21]; int score;};//这里创建了一个结构体用来存储姓名和分数int main(){ struct student a[100],t; int i,j,n; cout<<"请输入共有多少个对象,即n="; cin>>n; cout<<"请依次输入n个人名和原创 2017-03-13 22:07:30 · 260 阅读 · 0 评论 -
2.4.2指针复习
#include#include//当在程序中使用malloc函数时需要用到stdlib.h头文件 using namespace std;int main(){ int *p;//定义一个指针p p=(int *)malloc(sizeof(int));//指针p获取动态分配的内存空间!!地址!! *p=10;//向指针p所指向的内存空间中存入10 cout<<*p;//输出指针p原创 2017-03-13 22:18:46 · 151 阅读 · 0 评论 -
2.5模拟链表
#include#define n 9using namespace std;int main(){ int data[101],right[101]; int i,t,len; //读入已有的数 cout<<"依次读入已有的数"<<endl; for(i=1;i<=n;i++){ cin>>data[i]; } len=n; //初始化数组right for(i=1原创 2017-03-13 22:19:34 · 152 阅读 · 0 评论 -
3.1坑爹的奥数
/*情景说明:()()()+()()()=()()(),即abc+def=ghi */#include#includeusing namespace std;int main(){ int a[10]={0},i,total=0,book[10]={0},sum; //这里用a[1]~a[9]来代替刚才的a,b,c,d,e,f,g,h,i for(a[1]=1;a[1]<原创 2017-03-13 22:21:03 · 415 阅读 · 0 评论 -
4.4.2再解炸弹人(BFSearch)
#includeusing namespace std;struct note{ int x;//横坐标 int y;//纵坐标};char a[21][21];//用来存储地图int i,j,k,sum,Max=0,mx,my,n,m,startx,starty,tx,ty;int getnum(int i,int j){ int num,x,y; sum=0;//sum用原创 2017-03-14 13:25:06 · 368 阅读 · 0 评论 -
4.4.1再解炸弹人(DFSearch)
#includeusing namespace std;char a[21][21];//用来存储地图int book[21][21]={0};//定义一个标记数组并全部初始化为0 int Max,mx,my,n,m;int getnum(int i,int j){ int num,x,y; int sum=0;//sum用来计数(可以消灭的敌人数),所以需要初始化为0 //将原创 2017-03-13 22:27:07 · 598 阅读 · 0 评论 -
4.3层层递进——广度优先搜索
#includeusing namespace std;struct note{ int x;//横坐标 int y;//纵坐标 int f;//父亲在队列中的编号,本题不需要输出路径,可以不需要f int s;//步数 };int main(){ struct note que[2501];//因为地图大小不超过50*50,因此队列扩展不会超过2500个 int a[51]原创 2017-03-13 22:26:04 · 438 阅读 · 0 评论