![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Wenbin_Yang
这个作者很懒,什么都没留下…
展开
-
骑士走棋盘(c/python)
骑士走棋盘:等价于中国象棋中马走日 算法思路:骑士所要走的下一步:为下一步再做选择时,选择能走的步数最少的一步。使用这个方法,在不使用递归的情况下,可以有较高的几率找出走法(有时可能也找不到走法)。C代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int traval(int x, int y);int原创 2017-11-06 20:33:41 · 2137 阅读 · 0 评论 -
洗扑克牌(乱数排列)(c/python略)
洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1~N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。原理:以1~52的乱数排列为例好了,可以将阵列先依序由1到52填入,然后使用一个回圈走访阵列,并随机产生1~52的乱数,将产生的乱数当作索引取出阵列值,并与目前阵列走访到的值相交 换 ,如此就不用担心乱数重复的问题了,阵列走访完毕后,所有的数字也就重新排列了。#include<s原创 2017-11-21 10:15:34 · 1749 阅读 · 0 评论 -
约瑟夫排列(c/python)
说明 据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中 , 39个犹太人决定宁愿死也不要被敌人到 , 于是决定了 一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他原创 2017-11-21 20:14:26 · 476 阅读 · 0 评论 -
中序式转后序式,前序式(C/python)
中序表达式 (a+b)*(c+d) 后续表达式 ab+cd+* 前序表达式 *+ab+cd说明平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,原创 2017-11-15 21:51:29 · 3842 阅读 · 1 评论 -
排列组合(c/python)
说明 将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。 C代码#include<stdio.h>#include<stdlib.h>#define N 4void prem(int *, int);int main(){ int num[N + 1];; for原创 2017-11-22 14:53:32 · 2210 阅读 · 0 评论 -
格雷码(c/python略)
Gray Code是一个数列集合 , 每个数使用二进位来表示 , 假设使用n位元来表示每个数好了 , 任两个数之间只有一个位元值不同:如三位数的格雷码: 000 001 011 010 110 111 101 100解法 观察奇数项的变化时,我们发现无论它是第几个Gray Code,永远只改变最右边的位元,如果是1就改为0,如果是0就改为1。观察偶数项的变化时,我们发现所改变的位元,是由右边算来原创 2017-11-22 20:26:54 · 373 阅读 · 0 评论 -
产生可能的集合(C/python)
给定一组数字或符号 , 产生所有可能的集合(包括空集合 ), 例如给定1 2 3 , 则可能的集合为 : {}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。非字典顺序如果不考虑字典顺序,则有个简单的方法可以产生所有的集合,思考二进位数字加法,并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字所产生的就是一个集合,例 如000 {} 001 {3原创 2017-11-23 11:22:57 · 556 阅读 · 0 评论 -
m个元素的n元素子集(c/python略)
解法 假设有5个元素的集点,取出3个元素的可能子集如下: {1 2 3} 、 {1 2 4 } } 、 {1 2 5} 、{1 3 4} 、{1 3 5} 、{1 4 5} 、 {2 3 4} 、 {2 3 5} 、{2 4 5} 、 {3 4 5} 这些子集已经使用字典顺序排列,如此才可以观察出一些规则: 如果最右一个元素小于m,则如同码表一样的不断原创 2017-11-23 16:41:49 · 755 阅读 · 0 评论 -
得分排行(c/python)
说明 假设有一教师依学生座号输入考试分数,现希望在输入完毕后自动显示学生分数的排行 ,当然学生的分数可能相同。解法: 用排名的阵列去走访分数阵列 排名阵列rank[N+2] 接下来走访分数阵列score[N+1]: 并在分数所对应的排行阵列索引位置加1,如60分,则rank[60]++将分数排行的最右边设置为1,即rank[N+1]=1,然后依次将右边的元素加置左边一个元素 c代码#inc原创 2017-11-23 22:00:55 · 730 阅读 · 0 评论 -
shell排序法-改良的插入排序(C)
说明插入排序法由未排序的后半部前端取出一个值,插入已排序前半部的适当位置,概念简单但速度不快。排序要加快的基本原则之一,是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,Shell排序法即是基于此一概念来改良插入排序法。解法Shell排序法最初是D.L Shell于1959所提出,假设要排序的元素有n个,则每次进行插入排序时并不是所有的元素同时进行时,而是取一段间隔。 Shel原创 2017-11-24 21:38:45 · 297 阅读 · 0 评论 -
插入,选择,冒泡排序(C/python略)
C代码#include<stdio.h>#include<stdlib.h>//选择排序/*将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个,例如:10 7 11 4 8 4 | 7 11 10 8 选出最小44 7 | 11 10 8 选出最小74 7 8 |10 11 选出最小84 7 8原创 2017-11-24 20:07:50 · 178 阅读 · 0 评论 -
shaker 排序法 - 改良的冒泡排序(C)
#include<stdio.h>#include<stdlib.h>/*shaker 排序法-改良的冒泡排序采用双向进行:先让气泡排序由左向右进行,再来让气泡排序由右往左进行 ,如此完成一次排序的动作,而您必须使用left与right两个旗标来记录左右两端已排序的元素位置。如:一个排序的例子如下所示:排序前:45 19 77 81 13 28 18 19 77 11往右排序:19 4原创 2017-11-25 15:03:51 · 552 阅读 · 0 评论 -
排序法-改良的选择排序(C)
Heap排序法使用Heap Tree(堆积树),树是一种资料结构,而堆积树是一个二元树,也就是每一个父节点最多只有两个子节点(关于树的详细定义还请见资料结构书籍),堆积树的 父节点 若小于子节点,则称之为最小堆积(Min Heap ),父节点若大于子节点,则称之为最大堆积( Max Heap),而同一层的子节点则无需理会其大小关系,例如下面就是一个堆积树: 我们可以用数组来存储堆积树的所有元素和原创 2017-11-25 22:07:39 · 942 阅读 · 0 评论 -
快速排序法一(C)
快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。解法 这边所介绍的快速演算如下:将最左边的数设定为轴,并记录其值为 s 廻圈处理: 令索引 i 从数列左方往右方找,直到找到大于 s 的数 令索引 j 从数列左右方往左方找,直到找到小于 s 的数 如果 i >= j,则离开回圈 如果 i < j,则交换索引原创 2017-11-26 16:08:16 · 374 阅读 · 0 评论 -
快速排序法二(C)
之前说过轴的选择是快速排序法的效率关键之一 , 在这边的快速排序法的轴选择方式更加快了快速排序法的效率。解法先说明这个快速排序法的概念,它以最右边的值s作比较的标准,将整个数列分为三个部份,一个是小于s的部份,一个是大于s的部份,一个是未处理的部份。具体例子如下图: 如图:初始化j=0;i=-1。用j去遍历数组,索引j所在位置的值如果小于s所在值,则交换(i+1)与j所在的值,否则,j++判断下一原创 2017-11-26 22:17:55 · 232 阅读 · 0 评论 -
基数排序(c)
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。解法:原创 2017-11-27 16:34:44 · 262 阅读 · 0 评论 -
二分法查找(C)
在二分搜寻法中,将数列不断的分为两个部份,每次从分割的部份中取中间数比对,例如要搜寻92于以下的数列,首先中间数索引为(0+9)/2 = 4(索引由0 开始): [3 24 57 57 67 68 83 90 92 95] 由于67小于92,所以转搜寻右边的数列: 3 24 57 57 67 [68 83 90 92 95] 由于90小于92,再搜寻右边的数列,这次就找到所要的数了: 3原创 2017-11-27 19:45:45 · 580 阅读 · 0 评论 -
最大访客数(c/python)
说明:确定某一时间的最大容客量,用X[i],y[i]分别表示第i个访客来访和离开的时间;c代码#include<stdio.h>#include<stdlib.h>#define N 100void sort(int *, int);int main(){ int i, j; int number = 0; int x[N] = { 0 }; int y[N]原创 2017-11-15 16:58:48 · 800 阅读 · 0 评论 -
阿姆斯壮数(c/python)
在三位的整数中,例如153可以满足1 3 + 5 3 + 3 3 = 153,这样的数称之为Armstrong数C代码#include<stdio.h>#include<stdlib.h>int main(){ //int num; //printf("请输入一个三位数:"); //scanf_s("%d", &num); for (int num = 100;原创 2017-11-15 12:27:11 · 1269 阅读 · 0 评论 -
完美数(c/python略)
如果有一数n , 其真因数 (Proper factor ) 的总和等于n , 则称之为完美数(Perfect Number ), 例如以下几个数都是完美数: 6 = 1 + 2 + 3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+248#include <stdio.h>#include <stdlib.h>#define P 10000bool原创 2017-11-15 12:06:39 · 559 阅读 · 0 评论 -
八皇后(c/python)
八皇后: 在8 * 8 的棋盘上,八个皇后两两不在同行,同列或者斜对角上解法1: 用三个数组分别代表同栏,主斜对角,副斜对角(具体如下面的C代码)解法2: 用C[i]=j表示第i行第j列放置皇后,则当第r行 C[r]!=C[i]表示不在同一列,当abs(r-i)!=abs(C[r]-C[i])时,表示不在同意斜线上(如下python代码)C代码#include<stdio.h>#include<s原创 2017-11-07 16:02:49 · 260 阅读 · 0 评论 -
八枚硬币(c\python略)
八枚硬币: 现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。c代码#include<stdio.h>#include<stdlib.h>#include<time.h>void getResult(int coins[]);int main(){ sran原创 2017-11-07 20:18:55 · 585 阅读 · 0 评论 -
生命游戏(c/python)
生命游戏的规则可简化为如下: 邻居个数为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。 邻居个数为2时,则该细胞下次状态为复活。 邻居个数为3时,则该细胞下次状态为稳定。c代码#include<stdio.h>#include<stdlib.h>#include<ctype.h>#define MAXROW 10#define MAXCOL 25#define DEAD 0原创 2017-11-08 21:01:14 · 461 阅读 · 0 评论 -
字串核对(c/python)
C代码#include<stdlib.h>#include<stdio.h>#include<string.h>int search(char *input, char *key, int p);void substring(char *test, char *temp, int h, int k);int skip[256];int main(){ char str_input原创 2017-11-10 22:07:49 · 479 阅读 · 0 评论 -
双色河内塔(c/python)
思路:和河内塔类似,采用递归 1,将n个盘子,两两(不同颜色相同大小的盘子)组成一组即n/2组 2,n/2组即类似于河内塔,将n/2-1组进行河内塔操作,即把n/2-1从A 划到C,此时A中存在第n/2组(第一次河内塔操作) 3,将A中的第n/2组划到B,然后进行第二次河内塔操作,把C中的所有划到A中(此时A中有n/2组,B中是第n/2组) 4,将B中的第n/2组分开,即B中划一个盘子给C原创 2017-11-12 15:44:04 · 1115 阅读 · 0 评论 -
简单三色塔(c/python略)
类似于双色塔 代码功能: 三色:从下到上为红,蓝,黄 下面代码只能实现A中红色排列,B蓝,C黄#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include<stdlib.h>void move(int, char,char, char);void move_three_color(int disk){ char sours原创 2017-11-12 16:26:25 · 362 阅读 · 0 评论 -
背包问题(c/python)
假定背包的最大容量为W,N件物品,每件物品都有自己的价值和重量,将物品放入背包中使得背包内物品的总价值最大 假设有负重量 1~8的背包8个 构建N*W矩阵 行#0-4表示加入的物品编号 列0-8表示负重0-8的9个背包 (注最后一行3改成4) 如行号0,表示0号物体A,重4,只有在4号这个背包才能加入,后面背包5,6,7也只能加入4,8号背包可以加入两个A物体行号1,加入物原创 2017-11-13 13:25:59 · 405 阅读 · 0 评论 -
筛选求素数和普通求法(C/python略)
素数:除了自身之外,无法被其它整数整除的数称之为素数C代码(普通)#include<stdio.h>#include<stdlib.h>#include<math.h>#define N 100//普通方法int main(){ int i, j; for (i = 2; i < N; i++) { for (j = 2; j <= sqrt(i);原创 2017-11-13 19:13:30 · 351 阅读 · 0 评论 -
后序式运算(C/python略)
C代码(理论可参考中序式转后序)#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void jisuan(char *);float cal(float, float, char);void main(){ char input[80]; printf("中序式:"); scanf("原创 2017-11-17 19:37:25 · 583 阅读 · 0 评论 -
河内之塔算法实现(c与python)
c代码:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void HeNeizhita(int n, char A, char B, char C){ if (n == 1) printf("Move Sheet %d from %c to %c\n",n, A,C); els原创 2017-11-04 20:36:51 · 490 阅读 · 0 评论 -
费氏数列(c/python)
0,1,1,2,3,5,8,12……c代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;#define N 20int main(){ int a[N] = { 0 }; a[0] = 0; a[1] =原创 2017-11-04 21:11:49 · 884 阅读 · 0 评论 -
多维数组转一维数组(C)
C代码#include<stdio.h>#include<stdlib.h>//二维数组转一维/*以列为主的二维阵列要转为一维阵列时,是将二维阵列由上往下一列一列读入一维阵列,此时索引的对应公式如下所示,其中row与column是二维阵列索引,loc表示对应的一维阵列索引:loc = column + row*行数*/int main1(){ int num[3][3] =原创 2017-11-28 15:14:27 · 3308 阅读 · 0 评论 -
巴斯卡三角形(杨辉三角)(c/python)
1 1 1 1 2 1 1 3 3 1C代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;#define N 10void main(){ int a[N][N] = { 0 };原创 2017-11-05 16:01:15 · 866 阅读 · 0 评论 -
最大公因数,最小公倍数,因式分解(C/python略)
C代码#include<stdio.h>#include<stdlib.h>//最大公因数//最小公倍数int main1(){ int m, n, r; printf("请输入两数:"); scanf_s("%d%d", &m, &n); int s = m*n; while (n != 0) { r = m%n;原创 2017-11-14 18:47:59 · 1532 阅读 · 0 评论 -
三色旗(c/python)
三色旗对绳子上的三种颜色的旗子进行(蓝,白,红)排序 一开始b,w指向0索引,r指向最后一个索引 1 如果w指向蓝色 则交换b和w指向的值,同时,b,w加1 2 如果w指向白色,则w加1 3如果w指向红色 ,则交换w,r指向的值,同时r-1C代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#incl原创 2017-11-05 19:34:02 · 620 阅读 · 0 评论 -
老鼠走迷宫(c/python)
描述:迷宫设计用2代表墙壁,1代表走过的路径(老鼠的走法用上下左右四个方向) 用C代码打印出一条路线,用python实现打印多条路径C代码#include<stdio.h>#include<stdlib.h>int reach(int i, int j);int maze[7][7] = { { 2,2,2,2,2,2,2 },{ 2,0,0,0,0,0,2 },{ 2,0,2,0,2,0,2原创 2017-11-06 11:11:04 · 1866 阅读 · 0 评论 -
稀疏矩阵(C)
说明 如果在矩阵中,多数的元素并没有资料,称此矩阵为稀疏矩阵(sparse matrix ), 由于矩阵在程式中常使用二维阵列表示,二维阵列的大小与使用的记忆体空间成正比,如果多数的元素没有资料 , 则会造成记忆体空间的浪费 , 为 此 , 必须设计稀疏矩阵的阵列储存方式 , 利用较少的记忆体空间储存完整的矩阵资讯。C#include<stdio.h>#include<stdlib.h>int原创 2017-11-28 12:57:23 · 1024 阅读 · 0 评论