数据结构 迷宫 C++源代码 非递归解法
2010-05-30 16:49
253 查看
]coder_jack@126.com日记写到: 我现在还在写控制台程序!这么多年来,我没有一丝进步!要加油! 程序很简单,用递归实现关键部分就好了,然而我的不同之处是,我没有用递归,我自己用栈解决了这个问题!虽然在本质上递归是由操作系统来构建一个栈,但是如果我能自己构造一个栈来解决问题的话,我就会对栈和递归的理解更深入一些!而且我还实现了以动态的方式显示行走路线,感觉很有趣!呵呵!以下是源代码,已经在vc 6.0 环境编译通过!(如果有幸被你转载的话,请注明出处!我的blog:http://blog.163.com/coder_jack@126 //功能:迷宫求解 //作者:CPP //E_mail:coder_jack@126.com //版本:200811281030 //备注:非递归解法,用栈实现 #include <iostream.h> #include <stdlib.h> #include <time.h>//因为要产生随机函数种子 #include <windows.h>//因为要用Sleep延时函数 #define MAX_X 20 //定义迷宫大小 #define MAX_Y 20 int maze[MAX_X][MAX_Y]; class stack_for_maze//迷宫行走路线存储专用栈类! { private: struct node//结点用来记录压栈的迷宫坐标 { int x; int y; char direction; //上一步的行走方向(即如何来到这里的) → ← ↑ ↓ node* next; }; node* head; public: stack_for_maze()// 构造函数 { head=NULL; } ~stack_for_maze()//析构函数 { node* p=head; while(head!=NULL) { head=head->next; delete p; p=head; } } //________________________________________ void push(int xx,int yy,char ddirection)//压栈,将坐标和行走方向压栈 { node* new_node; new_node=new node; if(new_node!=NULL) { new_node->x=xx; new_node->y=yy; new_node->direction=ddirection; new_node->next=NULL; if(head==NULL) head=new_node; else { new_node->next=head; head=new_node; } } else cout<<"/n 因为内存分配失败导致本次压栈失败!!!/n"; } //________________________________________ node* pop(int& xx,int& yy)//出栈时带回栈顶元素坐标 { if(head!=NULL) { node* p=head; head=head->next; xx=p->x; yy=p->y; delete p; } else { cout<<"/n因为栈已空导致本次出栈失败/n"; } return head; } //________________________________________ void print()//输出栈内元素 { if(head!=NULL) { node* p=head; while(p!=NULL) { cout<<" "<<p->x<<" "<<p->y<<" "<<p->direction<<endl; p=p->next; } } else cout<<"/n 栈为空,打印失败/n"; } }; //_______________________________________________________ void CreateMaze()//创建迷宫 { int max_way=MAX_X*MAX_Y;//产生通路的参数,值越大障碍越少 int x,y; for(x=0;x<MAX_X;x++) for(y=0;y<MAX_Y;y++) maze[x][y]=1; //先把迷宫全部设为墙壁 srand((unsigned)time(NULL));//随机函数种子发生器(以时间做参数) for(int i=0;i<=max_way;i++)//随机构建迷宫通路 { x=rand()%(MAX_X-2)+1; y=rand()%(MAX_Y-2)+1; maze[x][y]=0; } maze[1] [1]=0;//入口 maze[MAX_X-2][MAX_Y-2]=0;//出口 maze[0][1]=8; maze[MAX_X-1][MAX_Y-2]=0; } //_________________________________________________________ void PrintMaze()//输出迷宫的当前状态 { int x,y; system("cls");//清屏 cout<<endl; for(x=0;x<MAX_X;x++) { for(y=0;y<MAX_Y;y++) { if(maze[x][y]==0){cout<<" ";continue;}//通路 if(maze[x][y]==1){cout<<"■";continue;}//墙 if(maze[x] [y]==2){cout<<"×";continue;}//死胡同 if(maze[x][y]==3){cout& lt;<"↓";continue;}//向下走 if(maze[x][y]==4){cout<<"→"; continue;}//向右走 if(maze[x][y]==5){cout<<"←";continue;}//向左走 if(maze[x] [y]==6){cout<<"↑";continue;}//向上走 if(maze[x][y]==7){cout& lt;<"※";continue;}//当前站立位置 if(maze[x][y]==8){cout<<" ";continue;}//通路 } cout<<endl; } Sleep(200);//延时函数 } //_________________________________________________________ void move(stack_for_maze &s) { int x=1,y=1;//出发点 while(1) { maze[x][y]=2; //-----------------------向下探路 if(maze[x+1][y]==0)// ↓ { s.push(x,y,'D');// 当前位置压栈 maze[x][y]=3;//将当前位置做一个向下的标记↓用代码3表示 x=x+1;//向下走到一个新位置 maze[x] [y]=7;//标记当前站立位置为7,用符号※表示 PrintMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)) { s.push(x,y,'*'); cout<<"/n 成功走出!!!/n"; return; } else continue; } //-----------------------向右探路 if(maze[x][y+1]==0)// → { s.push(x,y,'R');// 当前位置压栈 maze[x][y]=4;//将当前位置做一个向右的标记→用代码4表示 y=y+1;//向右走到一个新位置 maze[x] [y]=7;//标记当前站立位置为7,用符号※表示 PrintMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)) { s.push(x,y,'*'); cout<<"/n 成功走出!!!/n"; return; } else continue; } //-----------------------向上探路 if(maze[x-1][y]==0)// ↑ { s.push(x,y,'U');// 当前位置压栈 maze[x][y]=6;//将当前位置做一个向上的标记↑用代码6表示 x=x-1;//向上走到一个新位置 maze[x] [y]=7;//标记当前站立位置为7,用符号※表示 PrintMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)) { s.push(x,y,'*'); cout<<"/n 成功走出!!!/n"; return; } else continue; } //-----------------------向左探路 if(maze[x][y-1]==0)// ← { s.push(x,y,'L');// 当前位置压栈 maze[x][y]=5;//将当前位置做一个向左的标记←用代码5表示 y=y-1;//向左走到一个新位置 maze[x] [y]=7;//标记当前站立位置为7,用符号※表示 PrintMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)) { s.push(x,y,'*'); cout<<"/n 成功走出!!!/n"; return; } else continue; } //--------------------上下左右均不通则回退,即出栈一次,如果出栈导致栈空则说明无路可走了! if(s.pop(x,y)==NULL&&maze[x-1][y]!=0&&maze[x][y-1]!=0&&maze[x][y+1]!=0&&maze[x+1][y]!=0) { cout<<"/n 没有找到合适路径!!!/n"; maze[0][1]=7;//没有找到路,就站在起点吧! if(maze[1][1]!=1)maze[1][1]=2; return; } } } //_________________________________________________________ void main() { CreateMaze();//创建迷宫 PrintMaze();//输出当前迷宫的初始状态 stack_for_maze stack;//定义一个栈的对象,用来记录行走路线 move(stack);//行走中…… PrintMaze();//输出迷宫的最终状态 //stack.print(); } //END______________________________________ coder_jack@126.com日记写到 200812040032
相关文章推荐
- c++ 数据结构 用递归方法解决迷宫问题
- 八皇后问题C++递归解法
- [C++]数据结构:二叉树中已知先序中序求后序的递归方法
- C语言-数据结构-归并排序(merge sort)-递归 迭代-源代码及分析
- C++数据结构: 二叉搜索树 (非递归)
- 迷宫的另一种解法[非递归]
- 数据结构-二叉树:C++模板类递归实现与非递归实现
- 数据结构(迷宫求解c++)
- “第一次亲密接触”--数据结构,迷宫的生成、走通(非递归)
- C++数据结构--递归--最大公约数,斐波那契数
- C++ 递归计算器 源代码
- 从递归问题继续看c++数据结构
- 迷宫c++源代码 by Reason
- 数据结构-C++ 迷宫
- Fibonacci数列非递归解法 C++实现
- 数据结构_二叉树的先序建立与先序,中序,后序(递归)遍历方式_C语言源代码
- 数据结构:maze迷宫求解(C++)
- 汉诺塔算法的递归与非递归的C以及C++源代码
- 数据结构 栈 c++ 源代码实现
- 单链表的设计和非递归,递归逆序方法源代码,dev-c++下可直接运行.