• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
数据结构:栈和递归求两顶点所有简单路径
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
数据结构:栈和递归求两顶点所有简单路径
软件发布 数据结构:栈和递归求两顶点所有简单路径
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 认证考试 >> 程序员 >> 数据结构:栈和递归求两顶点所有简单路径

数据结构:栈和递归求两顶点所有简单路径

添加时间: 2007-4-9 0:57:35  作者: 程序员认证参考  阅读次数:131   来源: http://www.d9soft.com

       

栈和递归在程序设计中的应用是非常广的,比如对于迷宫的求解、表达式的求解,等都可以用栈来解决,典型的hanoi塔问题,树和图的遍历等都可以用递归来解决,在数据结构等很多书中都有介绍,如果对此不了解,可去参考。递归算法的设计实际上就是对问题的抽象的过程,如果抽象到每个小问题都有相同特征时,那就形成了递归,递归算法简明易懂,下面我就介绍一种利用到栈与递归求解两顶点所有简单路径的问题。

  先说明一下什么叫“两顶点的所有简单路径”的概念,“两顶点的所有简单路径”的意思通熟的讲就是在图中有若干点,点与点之间可有边相连(在数据结构中叫“图”),任意设个起点和终点,现在要求的是从起点到终点所有可能通过的边序列的集合。(注:是简单有序边,也就是说简单路径,所谓简单路径就是序列中顶点不重复出现的路径。)举个例子:从上海到北京,我可以直接到达,也可以先到四川,再到北京,或者先到广东,再到北京,等等。如:上海->四川->上海->北京,这就不是简单路径了,显然,不是简单的路径有无数条。

为了描述方便,我用了简单的二维数组来做存储结构。(当然,完全可以用邻接矩阵、邻接表、十字链表、邻接多重表等来表示)

* * *

* * *

* * *

如上图左上角的坐标为(1,1),右上角的坐标为(3,1),左下角的坐标为(1,3),右下角的坐标为(3,3),点与点之间都可相通,假设从点(1,1)要到(3,3),有多少种走法?

对这个问题的求解先要认识到它的本质,其本质是一个点有四个方向(各边特殊处理),依次探索四个方向上的点,判断是不是最后的目的地,如果是,则进栈并返回,如果不是则进栈,将此点同样上述处理。显然这个过程是一个递归的过程,直到是最后的目的地,才层层返回。

当然,解决此问题不是只有栈与递归才能解决,经我自己摸索,用生成树的方法访问其双亲结点,也可解决,如果有更好的方法,请多多指教。

注意:当运行程序时,输入的maxx,maxy的数最好小等于3,不然效率很低!

//用栈和递归求解两顶点的所有简单路径
//borland c++ 3.1下编译通过

#include <stdlib.h>
#include <iostream.h>
#define SIZE 100
#define STACK_INIT_SIZE 1
#define STACKINCREMENT 1
typedef struct pos{
int x,y;
}pos;
typedef struct{
pos *base,*top;
int stacksize;
}sqstack;
sqstack s;
pos pstack[SIZE][SIZE];
int m=0,maxx,maxy;

int initstack(sqstack &s){
s.base=(pos *)malloc(STACK_INIT_SIZE*sizeof(pos));
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return 1;
}
int push(sqstack &s,pos e){
if(s.top-s.base>=s.stacksize){
s.base=(pos *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(pos));
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return 1;

int pop(sqstack &s,pos &e){
if(s.top==s.base) return 0;
e=*--s.top;
return 1;
}
int stacktraverse(sqstack s,pos e){
int i;
for(i=0;(s.base+i)<=(s.top-1);i++)
if(((s.base+i)->x==e.x) && ((s.base+i)->y==e.y)) return 0;
return 1;
}
void list(int maxx,int maxy,pos a,pos b)
{
int fx,n;pos c;
push(s,a);
if(a.x==b.x && a.y==b.y)
{
for(n=0;(s.base+n)<=(s.top-1);n++) pstack[m][n]=*(s.base+n);m++;
pop(s,c);
return;
}
for(fx=1;fx<=4;fx++)
{
switch(fx)
{
case 1:
{if(a.x<maxx) {c.x=a.x+1;c.y=a.y;break;} else continue;}
case 2:
{if(a.y<maxy) {c.x=a.x;c.y=a.y+1;break;} else continue;}
case 3:
{if(a.x>1) {c.x=a.x-1;c.y=a.y;break;} else continue;}
case 4:
{if(a.y>1) {c.x=a.x;c.y=a.y-1;break;} else continue;}
}
if(stacktraverse(s,c)) list(maxx,maxy,c,b);
}
pop(s,c);
}

main()
{
int i,j;
pos a,b;
cout<<"max x=";
cin>>maxx;
cout<<"max y=";
cin>>maxy;
cout<<"start x=";
cin>>a.x;
cout<<"start y=";
cin>>a.y;
cout<<"end x=";
cin>>b.x;
cout<<"end y=";
cin>>b.y;
initstack(s);
list(maxx,maxy,a,b);
for(i=0;i<=m-1;i++){
for(j=0;j<=SIZE;j++)
{cout<<'('<<pstack[i][j].x<<','<<pstack[i][j].y<<')'<<" ";
if(pstack[i][j].x==b.x && pstack[i][j].y==b.y) break;}
cout<<" ";}
return 1;

 

上下文章:

 

上一篇文章: 数据结构:快速排序算法(新) 下一篇文章: 水滴石穿·C语言之代码检查工具

相关文章:

  • 艾瑞数据显示:暴风影音市场优势明显
  • 海加尔&黑暗神殿 简单易懂的魔兽世界法师攻略
  • 不需要花一分钱,教你如何简单造起自己的电子邮局
  • Photoshop简单的艺术化效果
  • 微软危急补丁涉及所有版本Windows

相关软件:

  • 简单淘 1.01b
  • WinXP SP2 简体版 至 2006 所有补丁集 BY XunChi
  • 三维数据成像3D Surfer 2.0
  • DOS万能驱动合集 (含有常见所有驱动)
  • Access数据库密码破解器 V2.65
  • 简单称重 v1.5标准版

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

认证考试分类导航

  • 微软认证
  • 计算机等级考试
  • 软件水平考试
  • 思科认证
  • Oracle认证
  • Linux认证
  • JAVA认证
  • 网络工程师
  • 系统工程师
  • 程序员

本类经典文章推荐

  • 软考系统分析师考试须知
  • C++箴言:绝不在构造或析构期调用...
  • 数据结构:判别是否为二叉排序树的...
  • 一个程序员的成长的六个阶段
  • 程序员英语试题常见硬件名和设备名
  • 从一个程序出发详细研究DataReader
  • 如何判断程序处于运行环境还是调试...
  • 程序高手必读:写好C程序的10条秘...
  • 程序员介绍:程序员的“素质”是什...
  • C++箴言:让=返回一个*this的引用

程序员阅读排行

  • 数据结构:判别是否为二叉排序树的...
  • VC++动态链接库(DLL)编程深入浅出...
  • VC++动态链接库(DLL)编程深入浅出...
  • 程序员考试:证书样本
  • 补码加、减运算规则及溢出判断
  • 数据结构:栈和递归求两顶点所有简...
  • DirectX8.0简介(8)
  • 水滴石穿·C语言之代码检查工...
  • 数据结构:打印线索二叉树的中序遍...
  • DirectX8.0简介(3)

认证考试阅读总排行

  • 全国计算机等级考试一级模拟试题01
  • 全国计算机等级考试一级模拟试题10
  • 全国计算机等级考试一级模拟试题08
  • MCSD简介
  • 全国计算机等级考试一级考试最新模...
  • 全国计算机等级考试一级模拟试题07
  • 全国计算机等级考试一级模拟试题02
  • 全国计算机等级考试一级模拟试题06
  • 全国计算机等级考试一级模拟试题03
  • 一级(WINDOWS)试题解析-Word篇

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有