数据--第20课-递归的应用实战二

第20课-递归的应用实战二

1. 递归与回溯

(1)递归在程序设计中也常用于需要回溯算法的场合。

(2)回溯算法的基本思想。

① 从问题的某一种状态出发,搜索可以到达的所有状态。

② 当某个状态到达后,可向前回退,并继续搜索其它可达状态 ,并继续搜索其它可达状态。

③ 当所有状态都到达后,回溯算法结束。

(3)程序设计中可利用函数的活动对象保存回溯算法的状态数据,因此可以利用递归完成回溯算法

2. 八皇后问题

在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,即不 能有两个皇后处在同一行、同一列或同一对角线上。

3. 解决方案--算法思路

(1)初始化:i = 1

(2)初始化:j = 1

(3)从第i行开始,恢复j的当前值,判断第j个位置

a. 位置 j可放入皇后:标记位置(i, j),i++ 转步骤2

b. 位置j不可放入皇后:j++转步骤a

c. 当j>8时,i--,转步骤3

4. 结束:

第8 第8行有位置可放入皇后

4. 程序

#include <stdio.h>

#define N 8

typedef struct _tag_Pos

{

int ios;

int jos;

} Pos;

static char board[N+2][N+2];

static Pos pos[] = { {-1, -1}, {-1, 0}, {-1, 1} };

static int count = 0;

void init()

{

int i = 0;

int j = 0;

for(i=0; i<N+2; i++)

{

board[0][i] = ‘#‘;

board[N+1][i] = ‘#‘;

board[i][0] = ‘#‘;

board[i][N+1] = ‘#‘;

}

for(i=1; i<=N; i++)

{

for(j=1; j<=N; j++)

{

board[i][j] = ‘ ‘;

}

}

}

void display()

{

int i = 0;

int j = 1;

for(i=0; i<N+2; i++)

{

for(j=0; j<N+2; j++)

{

printf("%c", board[i][j]);

}

printf("\n");

}

}

int check(int i, int j)

{

int ret = 1;

int p = 0;

for(p=0; p < 3; p++)

{

int ni = i;

int nj = j;

while( ret && (board[ni][nj] != ‘#‘) )

{

ni = ni + pos[p].ios;

nj = nj + pos[p].jos;

ret = ret && (board[ni][nj] != ‘*‘);

}

}

return ret;

}

void find(int i)

{

int j = 0;

if( i > N )

{

count++;

printf("Solution: %d\n", count);

display();

getchar();

}

else

{

for(j=1; j<=N; j++)

{

if( check(i, j) )

{

board[i][j] = ‘*‘;

find(i+1);

board[i][j] = ‘ ‘;

}

}

}

}

int main()

{

init();

find(1);

return 0;

}

小结

l  回溯算法是递归应用的重要场合。

l  利用函数调用的活动对象可以保存回溯算法中重要的变量信息。

原文地址:https://www.cnblogs.com/free-1122/p/11322815.html

时间: 2024-11-08 23:49:18

数据--第20课-递归的应用实战二的相关文章

数据-第16课-栈的应用实战二

第16课-栈的应用实战二 1. 问题的提出 计算机的本质工作就是数学运算,那计算机可以读入字符串”9 + (3 - 1) *5 +8/2”并且计算值吗? 2. 后缀表达式 波兰科学家在20世纪50年代提出了一种将运算符放在数字后面的后缀表达式. 对应的,我们平时用的数学表达式叫做中缀表达式. 实例 5 + 3 => 5 3 + 1 + 2 * 3 => 1 2 3 * + 9 + ( 3–1 ) * 5 => 9 3 1–5 * + 中缀表达式符合人类的阅读和思维习惯:后缀表达式符合计算

数据--第21课-递归课后练习

第21课-递归课后练习 1. permutation.c中的全排列算法只能处理集合中的元素各不相同的情况.设计算法,使其能够对重复元素的集合进行全排列. 2. 编程查找一个迷宫从起点到终点的通路! 提示 (1)可以用一个二维数组表示迷宫. l  元素1表示障碍. l  元素0表示可通行. (2)创建一个和迷宫等大小的二维数组作为标记数组. l  当标记数组位置为0且迷宫对应位置为 0时,可通行 . (3)利用回溯法“探路”. l  当前路不可通行时,在标记数组对应位置标记1,并回溯. 是否可以找

数据-第19课-递归的应用实战一

第19课-递归的应用实战一 1. 递归的数学思想 (1)      递归是一种数学上分而自治的思想. (2)      递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理. (3)      递归需要有边界条件. l  当边界条件不满足时,递归继续进行. l  当边界条件满足时,递归停止. 2 . 递归的数学表示 n > 1 n==1 (1)斐波拉契数列递归解法 #include <stdio.h> int fibonacci(int n) { if( n > 1 ) {

Spark3000门徒第10课Java开发Spark实战总结

今晚听了王家林老师的第10课Java开发Spark实战,课后作业是:用Java方式采用Maven开发Spark的WordCount并运行在集群中 先配置pom.xml <groupId>com.dt.spark</groupId> <artifactId>SparkApps</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging

Spark IMF传奇行动第20课:top N总结

版权声明:本文为博主原创文章,未经博主允许不得转载.作者:HaiziS 今晚听了王家林老师的Spark IMF传奇行动第20课:top N,作业是:scala写topGroup,且对组名key排序 代码如下: def main(args: Array[String]){ val conf = new SparkConf() //创建SparkConf对象 val sc = new SparkContext(conf) //通过传入SparkConf实例来定制Spark运行具体参数和配置信息来创建

第20课-数据库开发及ado.net 可空值类型,资料管理器,多条件查询,Case

第20课-数据库开发及ado.net 可空值类型,资料管理器,多条件查询,Case SqlHelper using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Text; namespace _02省市联动 { public static  class SqlHelper { //

中华石杉 Spark大型项目实战:电商用户行为分析大数据平台138讲视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

基于大数据技术之电视收视率企业项目实战(hadoop+Spark)张长志(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

大数据实时流统计视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv