主要是从汉诺塔及八皇后问题体会递归算法。

汉诺塔:

#include <stdio.h>

void move(int n, char x,char y, char z)
{
if(1==n)
{
printf("%c-->%c\n",x,z);
}
else
{
move(n-1,x,z,y); //将n-1个盘子从x借助z移到y上
printf("%c-->%c\n",x,z); //将第n个盘子从x移到z上
move(n-1,y,x,z); //将n-1个盘子从y借助x移到z上
}
}

int main()
{
int n;

printf("请输入汉诺塔的层数:\n");
scanf("%d",&n);
printf("移动的步骤如下:\n");
move(n,'X','Y','Z');

return 0;
}

八皇后:

在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行,同一列,问有多少种摆法(92种,穷举法):

代码如下:

#include <stdio.h>
#include <stdlib.h>

int count=0;

int notDanger(int row,int j,int(*chess)[8])
{
int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
//判断列方向
for(i=0;i<8;i++)
{
if(*(*(chess+i)+j)!=0)
{
flag1=1;
break;
}
}
//判断左上方
for(i=row,k=j;i>=0 && k>=0;i--,k--)
{
if(*(*(chess+i)+k)!=0)
{
flag2=1;
break;
}
}
//判断右下方
for(i=row,k=j;i<8 && k<8;i++,k++)
{
if(*(*(chess+i)+k)!=0)
{
flag3=1;
break;
}
}
//判断右上方
for(i=row,k=j;i>=0 && k<8;i--,k++)
{
if(*(*(chess+i)+k)!=0)
{
flag4=1;
break;
}
}
//判断左下方
for(i=row,k=j;i<8 && k>=0;i++,k--)
{
if(*(*(chess+i)+k)!=0)
{
flag5=1;
break;
}
}
if(flag1 || flag2 || flag3 || flag4 || flag5)
{
return 0;
}
else
{
return 1;
}
}

void EightQueen(int row, int n, int(*chess)[8]) //三个参数表示行,列,及指向期盼每一行的指针
{
int i,j,chess2[8][8];

for( i=0;i<8;i++)
{
for( j=0;j<8;j++)
{
chess2[i][j]=chess[i][j];
}
}

if(8==row)
{
printf("第%d种\n",count+1);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%d ",*(*(chess2+i)+j));
}
printf("\n");
}
printf("\n");
count++;
}
else
{
for(j=0;j<n;j++)
{
if(notDanger(row,j,chess))//判断这个位置是否有两个皇后冲突
{
for(i=0;i<8;i++)
{
*(*(chess2+row)+i)=0;
}
*(*(chess2+row)+j)=1;
EightQueen(row+1,n,chess2);
}
}
}
}

int main()
{
int chess[8][8],i,j;

for(i=0;i<8;i++) //0表示没有数据,1表示存放皇后
{
for(j=0;j<8;j++)
{
chess[i][j]=0;
}
}

EightQueen(0 ,8 ,chess);

printf("总共有%d种解决方法!\n\n",count);

return 0;
}

数据结构0103汉诺塔&八皇后的更多相关文章

  1. 数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)

    递归 顾名思义,递归就是递归就是递归就是递归就是递归......就是递归 Google递归:

  2. 题目---汉诺塔及AI代码及八皇后

    2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...

  3. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  4. 数据结构--汉诺塔递归Java实现

    /*汉诺塔递归 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面 * 2.将编号N的1个圆盘,从A移动到C上面 * 3.最后将B上面的N-1个圆盘移动到C上面 * 注意:盘子的编号从上到下1-N ...

  5. 数据结构--汉诺塔--借助栈实现非递归---Java

    /*汉诺塔非递归实现--利用栈 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 * 2.先进栈,在利用循环判断是否栈空, * 3.非空情况下,出栈,检查是否只有一个盘子--直接移 ...

  6. python数据结构_递归_汉诺塔问题

    已经不是第一次写这个汉诺塔问题, 其实递归还真是不太好理解, 因为递归这种是想其实有点反人类, 为什么? 因为不太清楚, 写个循环一目了然, 用递归其实要把核心逻辑理清楚, 要不根本没法进行下去 所有 ...

  7. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  8. 用turtle库实现汉诺塔问题~~~~~

    汉诺塔问题 问题描述和背景: 汉诺塔是学习"递归"的经典入门案例,该案例来源于真实故事.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬ ...

  9. Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)

    学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...

随机推荐

  1. .htaccess基本语法和应用 (2012-11-09 16:13:47)转载▼

    htaccess基本语法和应用 (2012-11-09 16:13:47) 转载▼ 标签:  htaccess it 分类: 网络 .htaccess是Apache服务器的一个非常强大的分布式配置文件 ...

  2. ThinkPHP Where 条件中使用表达式

    本文转自:这里 Where 条件表达式格式为: $map['字段名'] = array('表达式', '操作条件'); 其中 $map 是一个普通的数组变量,可以根据自己需求而命名.上述格式中的表达式 ...

  3. Spark 官方文档(5)——Spark SQL,DataFrames和Datasets 指南

    Spark版本:1.6.2 概览 Spark SQL用于处理结构化数据,与Spark RDD API不同,它提供更多关于数据结构信息和计算任务运行信息的接口,Spark SQL内部使用这些额外的信息完 ...

  4. 微信小程序常见问题集合(长期更新)

    最新更新: 新手跳坑系列:推荐阅读:<二十四>request:fail错误(含https解决方案)(真机预览问题 跳坑指南<七十>如何让微信小程序服务类目审核通过 跳坑六十九: ...

  5. Microsoft QAS架接项目

    1,p位置玩文件后.运行程序命令是: QCSQueryLabelWithLES.exe -c %CD%\FinalQASModelDir --variant AMyMovie --outputFull ...

  6. 【JS】字符串操作

    1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...

  7. R语言常用函数

    统计: mean:平均数sd:Standard Deviation 标准差var:方差median:中位数cov:协方差cor:相关系数 #环境ls/objectsrmhelp() library() ...

  8. NPA——.NET Persistence API

    你可曾听说过JPA. 有JPA那么就一定有NPA. 软件架构的路上一定少不了这个名词. —————————————————————————————————————————————— P Persist ...

  9. Java:方法的参数是传值还是传引用

    Java中方法的参数总是采用传值的方式. 下列方法欲实现对象的交换,但实际上是不能实现的. public void swap(simpleClass a,simpleClass b){ simpleC ...

  10. dubbox rest服务

    1.xml配置: web.xml 定义监听的contextpath,见rest协议定义 <servlet> <servlet-name>dispatcher</servl ...