| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1104 人关注过本帖
标题:如何用C实现最短迷宫路径求解之问题?
只看楼主 加入收藏
wenzenglin
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-2-26
收藏
 问题点数:0 回复次数:3 
如何用C实现最短迷宫路径求解之问题?

#include<iostream.h>
#include<assert.h>
#include<math.h>
enum Boolean{False,True};
template<class Type> class Stack{
public:
Stack(int =20);
~Stack(){ delete [] element;}
void Push(const Type &item);
Type Pop();
Type GetTop();
void MakeEmpty() { top=-1;}
int IsEmpty() const { return top == -1;}
int IsFull() const { return top==maxSize-1;}
private:
int top;
Type *element;
int maxSize;
};
template<class Type>
Stack<Type>::Stack(int s):top(-1),maxSize(s){
element=new Type[maxSize];
assert(element !=0);
};
template<class Type>
void Stack<Type>::Push(const Type &item){
assert( !IsFull());
element[++top]=item;
}
template<class Type>
Type Stack<Type>::Pop(){
assert(!IsEmpty());
return element[top--];
}
template<class Type>
Type Stack<Type>::GetTop(){
assert(!IsEmpty());
return element[top];
}
void ShowMaze(int maze[10][10]){
int i,j;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
cout<<maze[i][j]<<" ";
}
cout<<endl;
}
}
typedef struct{
int i;//行
int j;//列
}PosType;

typedef struct{
int ord;// 序号
PosType seat;//位置
int di; //方向 1,2,3,4
}SElemType;
int Pass(int maze[10][10],PosType pos)
{
return maze[pos.i][pos.j]==0;
}
void FootPrint(int maze[10][10],PosType pos)
{
maze[pos.i][pos.j]=8;
}
PosType NextPos(int maze[10][10],PosType pos,int di)
{
switch(di){
case 1: pos.j+=1;break;
case 2: pos.i+=1;break;
case 3: pos.j-=1;break;
case 4: pos.i-=1;break;
}
return pos;
}
void MarkPrint(int maze[10][10],PosType pos)
{
maze[pos.i][pos.j]=2;
}
void MazePath(int maze[10][10],PosType start,PosType end)
{
Stack<SElemType> S;
PosType curpos=start;
SElemType e;
int curstep=1;
do{
if(Pass(maze,curpos)){ //当前位置是否是通路
FootPrint(maze,curpos);
e.ord=curstep;
e.seat=curpos;
e.di=1;
S.Push(e);
if(curpos.i == end.i && curpos.j == end.j) return;
curpos=NextPos(maze,curpos,1);
curstep++;
}
else{
if( ! S.IsEmpty()){
e=S.Pop();
while(e.di == 4 && !S.IsEmpty()){
MarkPrint(maze,e.seat); e=S.Pop();
}
if(e.di <4)
e.di++; S.Push(e);
curpos=NextPos(maze,e.seat,e.di);
}
}
}while( ! S.IsEmpty());
return;
}
void main()
{
int Maze[10][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,1,0,0,0,1},
{1,0,1,1,1,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,1,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
ShowMaze(Maze);
PosType start,end;
cout<<"请输入起始坐标 "<<endl;
cin>>start.i; cin>>start.j;
cout<<"请输入终点坐标"<<endl;
cin>>end.i; cin>>end.j;

MazePath(Maze,start,end);

ShowMaze(Maze);
}

这是一条通路的算法,但不是最短路径,哪位朋友能助我一臂之力?

搜索更多相关主题的帖子: 迷宫 路径 求解 
2007-02-26 19:52
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
大致看了一下,你这个是个搜索方法,不带最优性质.你可以参考一下Dijkstra的所有顶点对的最短路径算法.

倚天照海花无数,流水高山心自知。
2007-03-02 12:12
wenzenglin
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-2-26
收藏
得分:0 
Digkstra是什么东东
2007-03-03 11:48
liuhaigang19
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-6-7
收藏
得分:0 
这是c语言写的吗??怎么一开始就出现#include<iostream.h>阿??

2007-06-07 13:37
快速回复:如何用C实现最短迷宫路径求解之问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037486 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved