(干货菌:枚举和递归是所有算法的根基,所有算法也都是这两种思维的继续拓展。)

递归:某个函数直接或间接的调用自身。

f(x)=g(f(x-1)),已知f(0)的值和g(),就可以求出。

枚举是把一个问题划分为一组子问题(横向的),递归是把一个问题逐级分解成子问题(纵向的)。

阶乘的栈结构

解决:1、找出递归公式,2、找到递归终止条件。

小游戏:

游戏在一个分割成w*h个正方格子的矩形板上进行,每个正方格子上可以有一张游戏卡片,当然也可以没有。

问题描述(连连看):

当下面的情况满足时,认为两个游戏卡片之间有一条路径相连:

  • 路径只包含水平或者竖直的直线段
  • 路径不能穿过别的游戏卡片
  • 但是允许路径临时的离开矩形板

输入:

  • ·输入包括多组数据:一个矩形板对应一组数据
  • ·第一行包括两个整数w和h(1<=w,h<=75),分别表示矩形板的宽度和长度
  • ·下面的h行,每行包括W个字符,表示矩形板上的游戏卡片分布情况:
  • ·使用X’表示这个地方有一个游戏卡片
  • ·使用空格表示这个地方没有游戏卡片
  • ·之后每行上包括4个整数:×1,y1,×2,y2(1<=x1,x2<=w,1<=y1,y2<=h)
  • ·给出两个卡片在矩形板上的位置
  • 注意:矩形板左上角的坐标是(1,1)输入保证这两个游戏卡片所处的位置是不相同的如果一行上有4个0,表示这组测试数据的结束
  • ·如果一行上给出W=h=0,那么表示所有的输入结束了

输出:

  • ·对每一个矩形板,输出一行“Board#n:",n是输入数据的编号
  • ·对每一组需要测试的游戏卡片输出一行.这一行的开头是“Pairm:”,这里m是测试卡片的编号(对每个矩形板编号都从1开始)
  • ·如果可以相连,找到连接这两个卡片的所有路径中包括线段数最少的路径,输出“k segments."
  • k是找到的最优路径中包括的线段的数目
  • ·如果不能相连,输出“impossible.”
  • ·每组数据之后输出一个空行

迷宫求解问题:

  • 自相似性表现在每走一步的探测方式相同,可以用递归方法求解
  • 通过枚举方式找到从起点到终点的路径,朝一个方向走下去:

·如果走不通,则换个方向走

  • >四个方向都走不通,则回到上一步的地方,换个方向走
  • >依次走下去,直到走到终点

判断新位置(x,y)是否有效

·T1:(x,y)在边界之内

(x>-1)&&(x-1)&&(y

·T2:该位置没有游戏卡片并且未曾走过

((board[y][x]=="")&&(mark[y][x]==false))

·T3:已经到达终点

(x==end_x)&&(y==end_y)&&(board[y][x]=='X")

综上,(x,y)有效的条件是T1&&(T2||T3)

#include #include #define MAXIN 75char board[MAXIN+2J[MAXIN+2];/定义矩形板int minstep,w,h,to[4][2]={0,1},{1,0},{0-1},{-1,0};//定义方向bool mark[MAXIN+2][MAXIN+2];//定义标记数组void Search(int now_x,int now_y,int end_x,int end_y,int step,int f{ if(step>minstep)return;//当前路径数大于minstep,返回>优化策略 if(now_x==end_x&&now_y==end_y){ //到达终点 if(minstep>step)//更新最小路径数 minstep=step; return; } for(int i=0;i<4;i++){ //枚举下一步的方向 int x=now_x+to][0];/得到新的位置 int y=now_y+to[i][1]; if((x>-1)&&(x-1)&&(y0){ //读入起点和终点 count++;minstep=100000;//初始化minstep为一个很大的值 memset(mark,false,sizeof(mark)); //递归搜索 Search(begin_x,begin_y,end_x,end_y,0,-1); //输出结果 if(minstep<100000)printf("Pair%d:%d segments.In",count,minstep); else printf("Pair%d:impossible.",count); } printf(""); }return 0;}

递归算法1加到100_「算法」北京大学算法基础—递归(1)相关推荐

  1. 「数据结构」普林斯顿算法课第二周作业

    「数据结构」普林斯顿算法课第二周作业 Algorithm I, Princeton 编程作业: Deques and Randomized Queues 思路 Deque.java Randomize ...

  2. 「数据结构」普林斯顿算法课第一周作业

    「数据结构」普林斯顿算法课第一周作业 Algorithm I, Princeton 编程作业: Percolation 思路 第一部分代码展示 第二部分代码展示 编程作业: Percolation P ...

  3. 「机器学习」机器学习算法优缺点对比(汇总篇)

    作者 | 杜博亚 来源 | 阿泽的学习笔记 「本文的目的,是务实.简洁地盘点一番当前机器学习算法」.文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的 ...

  4. 2017,人们视算法为「洪水猛兽」;算法说:我不想背锅

    编译 | 陈韵竹 作者 | Tom Simonite 来源 | Wired 穆罕默德·本·穆萨·阿尔·花剌子模是公元九世纪的一位波斯学者.在阿尔·花剌子模逝世的数个世纪之后,他的作品引领欧洲进入小数和 ...

  5. 「游戏」寻路算法之A Star算法原理及实现

    前言 自动寻路是在一些如MMORPG等类型游戏中常见的一种功能,其给了玩家良好的游戏体验,使得玩家在游戏过程中省去了大量游戏坐标点的记录以及长时间的键盘操作,不必记忆坐标,不必担心迷路,用最快捷的方法 ...

  6. 【LOJ】 #2540. 「PKUWC2018」随机算法

    题解 感觉极其神奇的状压dp \(dp[i][S]\)表示答案为i,然后不可选的点集为S 我们每次往答案里加一个点,然后方案数是,设原来可以选的点数是y,新加入一个点后导致了除了新加的点之外x个点不能 ...

  7. 递归算法1加到100_五种循环方法计算1加到100

    上文讲过1加到100,详细解释了计算的过程,如果理解了以前的文章,就容易理解今天的内容了. 1加到100使用VBA我能使用十来种方法,以下也是一种方法. While --wend循环 Private ...

  8. 算法分析与设计「三」二分算法

    我们都知道,如果你输入了一个 1 到 1000 之内的数,电脑最多猜 10 次就可以猜到正确的答案.而这是为什么呢 ?其实,这就是用到了本文要讲述的二分搜索算法. 一.什么是二分搜索 在计算机科学中, ...

  9. 开发者专访|我从「人间地狱」的算法岗内卷中,倔强地踏出了一条路 前路漫漫,星芒万里

    写在前面 从研究生踏入人工智能的范畴,王剑波的每一步都是朝着实际业务走去,而今年刚完成研究生学业的他也选择成立自己的算法公司,成为自己的领导. "三人行必有我师",王剑波始终认为优 ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——界面设计和实现
  2. LVM 逻辑卷的扩容/缩容
  3. selenium webdriver中执行js(java)
  4. matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
  5. 如何将Windows Server域(AD活动目录)中的用户导出并导入至Outlook2010通讯簿
  6. notepad++ linux 打开二进制文件
  7. 万字长文:近年来学界、业界视角下的“事理图谱”发展总结与思考
  8. POJ1958 Strange Towers of Hanoi [递推]
  9. Shell学习五-分割文件和提取文件名扩展名
  10. Pronunciation Difference between /ʌ/ and /ɑ/
  11. [Android实例] 【eoeAndroid社区索引】图形图像之动画
  12. 抽样函数sint/t反常求积分
  13. (github附源码)毕设微信小程序二手书交易后台PHP微擎
  14. 最简单ListView显示联系人姓名和电话号码
  15. 红米1联通版_标注:2013023_官方线刷包_救砖包_解账户锁
  16. leetcod--Missing Number
  17. r2d 小米路由器2_R2D小米路由器2亮黄灯无法上网的维修过程
  18. ST-Resnet 论文笔记
  19. 一文彻底搞懂extern用法
  20. 编译原理学习笔记04——(孙悟空学72变之菩提老祖的阴谋—可怕的左递归)——2014_1_18

热门文章

  1. android-手势-基础知识总结
  2. Ubuntu下实现双屏独立切换
  3. 【转载】oracle normal、sys、system、sysdba、sysoperdba的区别
  4. openSUSE12.1安装及基本设置
  5. 提高你的迅雷速度,绝对值得一看
  6. 华为机试HJ28:素数伴侣
  7. mysql sql dateadd_在SQL语句中DATEADD和DATEDIFF函数
  8. Jmeter负载和压力测试
  9. linux裸分区如何区分,Linux 裸设备基础知识
  10. 工作中遇到的问题——数据库