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

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

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. 【数学和算法】插值方法
  2. JavaSE各阶段练习题----文件和IO
  3. 对 makefile 中 $(MAKE) 的学习体会
  4. Leo的AR代码学习之create-react-class
  5. 第五十六期:IPv6只是增加了地址数量?其实真相并没有那么简单!
  6. Java中map关于putAll()和“=”的区别
  7. 美丽的数学家:如果您讨厌数学,这些其实都是人生故事
  8. 自学前端到底要学什么?五年老前端现身说法
  9. Clubhouse的不可能三角
  10. Servlet 中的out.print()与out.writer()的区别
  11. ad19pcb设置恢复默认_无需重装WINDOWS将计算机恢复到初始状态
  12. 数字信号处理-04- FPGA常用运算模块-除法器
  13. win10游戏不能窗口化怎么办?全屏游戏切换窗口的方法
  14. 【财富空间】一个人为什么要努力?(见过最好的回答)
  15. 学it中的python怎么样_长安大专网教学历
  16. 创新设计思维——做出好产品的艺术
  17. 一文读懂Tiger DAO VC模式,风险投资改朝换代
  18. 河池学院计算机宿舍,【2021】河池学院学校食堂环境与寝室宿舍介绍_优优招生网...
  19. 冒泡排序BubbleSort(两种写法)
  20. windows 以管理员身份打开命令行窗口

热门文章

  1. Ubuntu10.04设备未托管
  2. RSA 2010年信息安全大会六大热点预测
  3. Centos5安装Dell OpenManage Server Administrator
  4. python AES对称加密文件、解密文件
  5. c web mysql数据库_C语言操作MySQL数据库
  6. python如何得出数组里最大_如何理解Python里的字典dict?
  7. py导入包异常跳出_马克的Python学习笔记#模块和包
  8. c语言kmeans算法具体步骤,k-均值聚类算法c语言版
  9. 心理学系列:《乌合之众》读书笔记
  10. dbvisualizer报错No JVM