程序设计实习(II):算法设计 第15讲 递归.pptxVIP

  • 10
  • 0
  • 约7.44千字
  • 约 57页
  • 2018-01-30 发布于浙江
  • 举报

程序设计实习(II):算法设计 第15讲 递归.pptx

程序设计实习(II):算法设计 第15讲 递归

程序设计实习(II): 算法设计 第十五讲 递 归;主要内容;给定n,求阶乘n!; 主程序;递归的基本思想;枚举: 把一个问题划分成一组子问题, 依次对这些子问题求解 子问题之间是横向的、同类的关系 递归: 把一个问题逐级分解成子问题 子问题与原问题之间是纵向的、同类的关系 语法形式上:在一个函数的运行过程中,调用这个函数自己 直接调用:在fun()中直接执行fun() 间接调用:在fun1()中执行fun2();在fun2()中又执行fun1();递归的三个要点;递归解决问题的关键;POJ2802 小游戏;下面是一个例子: 这里在 (1, 3)和 (4, 4)处的游戏卡片是可以相连的。而在 (2, 3) 和 (3, 4) 处的游戏卡是不相连的,因为连接他们的每条路径都必须要穿过别的游戏卡片。 你现在要在小游戏里面判断是否存在一条满足题意的路径能连接给定的两个游戏卡片;输入 输入包括多组数据。一个矩形板对应一组数据。???组数据包括的第一行包括两个整数w和h (1 = w, h = 75),分别表示矩形板的宽度和长度。下面的h行,每行包括w个字符,表示矩形板上的游戏卡片分布情况。使用‘X’表示这个地方有一个游戏卡片;使用空格表示这个地方没有游戏卡片。 之后的若干行上每行上包括4个整数x1, y1, x2, y2 (1 = x1, x2 = w, 1 = y1, y2 = h)。给出两个卡片在矩形板上的位置 (注意:矩形板左上角的坐标是(1, 1))。输入保证这两个游戏卡片所处的位置是不相同的。如果一行上有4个0,表示这组测试数据的结束。 如果一行上给出w = h = 0,那么表示所有的输入结束了。;输出 对每一个矩形板,输出一行“Board #n:”,这里n是输入数据的编号。 然后对每一组需要测试的游戏卡片输出一行。这一行的开头是“Pair m: ”,这里m是测试卡片的编号(对每个矩形板,编号都从1开始)。接下来,如果可以相连,找到连接这两个卡片的所有路径中包括线段数最少的路径,输出“k segments.”,这里k是找到的最优路径中包括的线段的数目;如果不能相连,输出“impossible.”。 每组数据之后输出一个空行。 ;样例输入 5 4 XXXXX X X XXX X XXX 2 3 5 3 1 3 4 4 2 3 3 4 0 0 0 0 0 0 ;问题分析 (1);问题分析 (2);问题分析 (3);;设置搜索方向顺序是东、南、西、北;问题分析 (6);递归方法;参考程序; for(int i = 0;i 4;i ++){ //枚举下一步的方向 int x = now_x + to[i][0]; //得到新的位置 int y = now_y + to[i][1]; if ((x -1) (x w + 2) (y -1) (y h + 2) (((board[y][x] == ) (mark[y][x] == false))||((x==end_x) (y == end_y) (board[y][x] == ‘X’)))){ //如果新位置有效 mark[y][x] = true;//标记该位置已经经过 //上一步方向和当前方向相同, //则递归搜索时step不变,否则step+1 if(f == i) Search(x, y, end_x, end_y, step, i); else Search(x, y, end_x, end_y, step + 1, i); mark[y][x] = false; //回溯,该位置未曾走过 } } } ;int main() { int Boardnum = 0; while(scanf(“%d %d”, w, h)){ //读入数据 if(w == 0 h == 0)break; Boardnum ++; printf(Board #%d:\n, Boardnum); int i, j; for (i = 0;i MAXIN +

文档评论(0)

1亿VIP精品文档

相关文档