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

汉诺塔:

#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. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  2. STL

    STL qsort intcompare(constvoid*arg1,constvoid*arg2){ return(*(int*)arg1<*(int*)arg2)?-1: (*(int*) ...

  3. win7下IIS的安装和配置 图文教程

    转自   http://www.jb51.net/article/29787.htm 最近工作需要IIS,自己的电脑又是Windows7系统,找了下安装的方法,已经安装成功.在博客里记录一下,给需要的 ...

  4. 掌握 Linux PC 性能之基准测试

    导读 基准测试是一项测试或一系列测试,用来确定某个计算机硬件运行起来的状况有多好:在许多情况下,“基准测试”实际上等同于“压力测试”,通过测试硬件的极限,然后可以将测得的结果与其他硬件测得的结果作一番 ...

  5. Qt - 读取GPS数据

    1.GPS型号为ublox(EVK-M8L),配有USB接口,Qt版本5.7 2.实现步骤: (1)实现串口通信 采用Qt5.7 内置的串口操作类QSerialPort和QSerialPortInfo ...

  6. IE7 自动为文件路径添加域名

    对于图片等文件的路径,一般在同一个域名下的文件都会使用相对路径,但如果使用JS获取文件的路径浏览器获取到的路径都是相对路径,但IE7会自动为路径添加域名变成绝对路径... IE7下图片路径,在文件相对 ...

  7. BZOJ 3639: Query on a tree VII

    Description 一棵树,支持三种操作,修改点权,修改颜色,问所有与他路径上颜色相同的点的最大权,包含这两个点. Sol LCT. 用LCT来维护重边,对于每个节点在建一个set用来维护轻边,这 ...

  8. mapReduce的shuffle过程

    http://www.jianshu.com/p/c97ff0ab5f49 总结shuffle 过程: map端的shuffle: (1)map端产生数据,放入内存buffer中: (2)buffer ...

  9. layui常用方法

    很好用的一个ui组件,弹出,分页等 http://layer.layui.com/ 1 带叉叉的弹窗 layer.open({ type: , title: false, //不显示标题 conten ...

  10. JNDI

    这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别 网上关于这两个的 ...