数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法。
汉诺塔:
#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汉诺塔&八皇后的更多相关文章
- 数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)
递归 顾名思义,递归就是递归就是递归就是递归就是递归......就是递归 Google递归:
- 题目---汉诺塔及AI代码及八皇后
2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- 数据结构--汉诺塔递归Java实现
/*汉诺塔递归 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面 * 2.将编号N的1个圆盘,从A移动到C上面 * 3.最后将B上面的N-1个圆盘移动到C上面 * 注意:盘子的编号从上到下1-N ...
- 数据结构--汉诺塔--借助栈实现非递归---Java
/*汉诺塔非递归实现--利用栈 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 * 2.先进栈,在利用循环判断是否栈空, * 3.非空情况下,出栈,检查是否只有一个盘子--直接移 ...
- python数据结构_递归_汉诺塔问题
已经不是第一次写这个汉诺塔问题, 其实递归还真是不太好理解, 因为递归这种是想其实有点反人类, 为什么? 因为不太清楚, 写个循环一目了然, 用递归其实要把核心逻辑理清楚, 要不根本没法进行下去 所有 ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
- 用turtle库实现汉诺塔问题~~~~~
汉诺塔问题 问题描述和背景: 汉诺塔是学习"递归"的经典入门案例,该案例来源于真实故事. ...
- Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)
学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...
随机推荐
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- STL
STL qsort intcompare(constvoid*arg1,constvoid*arg2){ return(*(int*)arg1<*(int*)arg2)?-1: (*(int*) ...
- win7下IIS的安装和配置 图文教程
转自 http://www.jb51.net/article/29787.htm 最近工作需要IIS,自己的电脑又是Windows7系统,找了下安装的方法,已经安装成功.在博客里记录一下,给需要的 ...
- 掌握 Linux PC 性能之基准测试
导读 基准测试是一项测试或一系列测试,用来确定某个计算机硬件运行起来的状况有多好:在许多情况下,“基准测试”实际上等同于“压力测试”,通过测试硬件的极限,然后可以将测得的结果与其他硬件测得的结果作一番 ...
- Qt - 读取GPS数据
1.GPS型号为ublox(EVK-M8L),配有USB接口,Qt版本5.7 2.实现步骤: (1)实现串口通信 采用Qt5.7 内置的串口操作类QSerialPort和QSerialPortInfo ...
- IE7 自动为文件路径添加域名
对于图片等文件的路径,一般在同一个域名下的文件都会使用相对路径,但如果使用JS获取文件的路径浏览器获取到的路径都是相对路径,但IE7会自动为路径添加域名变成绝对路径... IE7下图片路径,在文件相对 ...
- BZOJ 3639: Query on a tree VII
Description 一棵树,支持三种操作,修改点权,修改颜色,问所有与他路径上颜色相同的点的最大权,包含这两个点. Sol LCT. 用LCT来维护重边,对于每个节点在建一个set用来维护轻边,这 ...
- mapReduce的shuffle过程
http://www.jianshu.com/p/c97ff0ab5f49 总结shuffle 过程: map端的shuffle: (1)map端产生数据,放入内存buffer中: (2)buffer ...
- layui常用方法
很好用的一个ui组件,弹出,分页等 http://layer.layui.com/ 1 带叉叉的弹窗 layer.open({ type: , title: false, //不显示标题 conten ...
- JNDI
这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别 网上关于这两个的 ...