数据结构 迷宫问题

数据结构 迷宫问题,第1张

#include <stdioh>

#include <malloch>

#include <conioh>

typedef struct pos /描述迷宫当前位置和方向/

{

int x;

int y;

int way; /0:无效,1:左,2:下,3:右,4:上/

}P;

typedef struct LinkNode /链表结构,用于栈的元素类型/

{

P pos;

struct LinkNode next;

}LinkNode;

typedef struct stack /链式栈,用于存储迷宫路径信息/

{

LinkNode head; /头指针/

}Stack;

int row=0; /迷宫的行数/

int line=0; /迷宫的列数/

void InitStack(Stack s) /栈置空/

{

s->head=NULL;

}

void Push(Stack s,P p) /数据入栈/

{

LinkNode LN=(LinkNode )malloc(sizeof(LinkNode));

LN->pos=p;

LN->next=s->head;

s->head=LN;

}

P Pop(Stack s) /栈顶元素出栈/

{

P pos;

LinkNode LN;

LN=s->head;

s->head=s->head->next;

pos=LN->pos;

delete LN;

return pos;

}

P GetPop(Stack s) /读取栈顶元素/

{

return shead->pos;

}

int Empty(Stack s) /判空/

{

if(shead==NULL)

return 1;

else

return 0;

}

int InitMaze() /返回迷宫的二维指针/

{

int maze=NULL;

int i;

int j;

printf("请输入迷宫的行跟列(x,y):");

scanf("%d,%d",&row,&line); /输入迷宫的行和列/

maze=(int )malloc((row+2)sizeof(int ));

for(i=0;i<row+2;i++)

{

maze[i]=(int )malloc(sizeof(int)(line+2));

}

printf("请输入迷宫\n"); /输入迷宫,1代表路障,0代表通行/

for(i=1;i<=row;i++)

for(j=1;j<=line;j++)

scanf("%d",&maze[i][j]);

for(i=0;i<line+2;i++) /将迷宫的四周都变为1/

maze[0][i]=1;

for(i=0;i<line+2;i++)

maze[row+1][i]=1;

for(i=0;i<row+2;i++)

maze[i][0]=1;

for(i=0;i<row+2;i++)

maze[i][line+1]=1;

for(i=0;i<row+2;i++) /输出迷宫/

{

for(j=0;j<line+2;j++)

printf("%3d",maze[i][j]);

printf("\n");

}

return maze;

}

void PrintWay(Stack p) /输出路径/

{

P pos;

Stack t; /临时栈,用于存储从入口到出口的路径/

LinkNode temp;

int a,b;

InitStack(&t);

temp=(LinkNode )malloc(sizeof(LinkNode));

temp->pos=Pop(&p); /取栈顶元素,即出口/

Push(&t,temp->pos); /入栈/

free(temp);

while(!Empty(p))

{

temp=(LinkNode )malloc(sizeof(LinkNode));

temp->pos=Pop(&p); /获取下一个元素/

a=GetPop(t)x-temp->posx; /左:a=0,b=1; 下:a=1,b=0/

b=GetPop(t)y-temp->posy; /右:a=0,b=-1 上:a=-1,b=0;/

if(b==1)

temp->posway=1;

else if(a==1)

temp->posway=2;

else if(b==-1)

temp->posway=3;

else if(a==-1)

temp->posway=4;

Push(&t,temp->pos); /新位置入栈/

free(temp);

}

printf("迷宫的路径为:\n");

printf("前两个数字表示位置,最后一个数字表示方向\n");

printf("1表示向左,2表示向下,3表示向右,4表示向上,0表示无方向\n");

while(!Empty(t)) /输出路径/

{

pos=Pop(&t);

printf("%3d,%3d,%3d\n",posx,posy,posway);

}

}

int FindMaze(int maze,int r,int l) /寻找路径,找到返回1,没找到返回0/

{

Stack p,q; /栈p,q分别表示探索迷宫的路径和过程/

P temp1,temp2;

int a,b;

InitStack(&p);

InitStack(&q);

temp1x=1;

temp1y=1; //

maze[1][1]=-1; /标记已经走过/

Push(&p,temp1);

Push(&q,temp1);

while(!Empty(q))

{

temp2=GetPop(q);

if(!(GetPop(p)x==GetPop(q)x

&&GetPop(p)y==GetPop(q)y))

Push(&p,temp2); /若有新元素入栈,就把q的栈顶元素存入p中/

a=temp2x;

b=temp2y+1; /当前位置左方向相邻的方块/

if(maze[a][b]==0)

{

temp1x=a;

temp1y=b;

maze[a][b]=-1; /标记已走过/

Push(&q,temp1);

}

if(a==r&&b==l) /到达出口/

{

temp1way=0;

Push(&p,temp1);

PrintWay(p);

return 1;

}

a=temp2x+1;

b=temp2y; /当前位置下方向相邻的方块/

if(maze[a][b]==0)

{

temp1x=a;

temp1y=b;

maze[a][b]=-1; /标记已走过/

Push(&q,temp1);

}

if(a==r&&b==l) /到达出口/

{

temp1way=0;

Push(&p,temp1);

PrintWay(p);

return 1;

}

a=temp2x;

b=temp2y-1; /当前位置右方向相邻的方块/

if(maze[a][b]==0)

{

temp1x=a;

temp1y=b;

maze[a][b]=-1; /标记已走过/

Push(&q,temp1);

}

if(a==r&&b==l) /到达出口/

{

temp1way=0;

Push(&p,temp1);

PrintWay(p);

return 1;

}

a=temp2x-1;

b=temp2y; /当前位置上方向相邻的方块/

if(maze[a][b]==0)

{

temp1x=a;

temp1y=b;

maze[a][b]=-1; /标记已走过/

Push(&q,temp1);

}

if(a==r&&b==l) /到达出口/

{

temp1way=0;

Push(&p,temp1);

PrintWay(p);

return 1;

}

if(GetPop(p)x==GetPop(q)x

&&GetPop(p)y==GetPop(q)y) /若四个方向都走不通,则数据出栈,退回一格/

{

Pop(&p);

Pop(&q);

}

}

return 0; /探索迷宫失败/

}

void main()

{

int maze=InitMaze(); /初始化迷宫/

if(FindMaze(maze,row,line)) /探索路径/

printf("路径探索成功!\n");

else

printf("路径探索失败!\n");

getch();

}

看下我的程序,,要不是你要的

#include <iostream>

#include <iomanip>

using namespace std;

#define M 20

#define N 20

struct move{int dx,dy;};

move mazemove[8];

char ma[M][N];

int False=0;

void maze()

{int i,j,num;

for(i=1;i<M-1;i++)

{for(j=1;j<N-1;j++)

{num=(800(i+j)+1500)%327;

if((num<156)&&(i!=M||j!=N))

ma[i][j]='1';

else

ma[i][j]='0';

}

}

ma[1][1]='0';

ma[M-2][N-2]='0';

for(i=0;i<M;i++)

{for(j=0;j<N;j++)

cout<<setw(3)<<ma[i][j];

cout<<endl;

}

}

void inimove()

{mazemove[0]dx=0;mazemove[0]dy=1;

mazemove[1]dx=1;mazemove[1]dy=1;

mazemove[2]dx=1;mazemove[2]dy=0;

mazemove[3]dx=1;mazemove[3]dy=-1;

mazemove[4]dx=0;mazemove[4]dy=-1;

mazemove[5]dx=-1;mazemove[5]dy=-1;

mazemove[6]dx=-1;mazemove[6]dy=0;

mazemove[7]dx=-1;mazemove[7]dy=1;

}

void outpath()

{int i,j,x,y,k;

i=1;j=1;k=0;

while((i!=(M-2))||(j!=(N-2)))

{for(k=0;k<8;k++)

{x=i+mazemove[k]dx;

y=j+mazemove[k]dy;

if(ma[x][y]=='0'){k=0;break;}

}

if(k!=8)

{if(ma[i][j]=='8')ma[i][j]='2';

if(ma[i][j]=='0')ma[i][j]='>';

i=x;j=y;

}

else

{for(k=0;k<8;k++)

{x=i+mazemove[k]dx;

y=j+mazemove[k]dy;

if(ma[x][y]=='8')break;

}

ma[i][j]='2';

i=x;j=y;

}

if((i==1)&&(j==1))

{False=0;

break;

}

else False=1;

}

}

int main()

{int i,j;

maze();

inimove();

outpath();

cout<<endl;

if(False==0)

cout<<"无法走出该迷宫!"<<endl;

else

{cout<<"走出迷宫的路径(用‘>’符号表示)为:"<<endl;

ma[M-2][N-2]='>';

for(i=0;i<M;i++)

{for(j=0;j<N;j++)

{ {if(ma[i][j]=='2')ma[i][j]='>';

if(ma[i][j]=='0')ma[i][j]=' ';

if(ma[i][j]=='1')ma[i][j]='';

}

cout<<setw(3)<<ma[i][j];

}

cout<<endl;

}

}

return 0;

}

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

程序如下:

#include"stdioh"

#include"stdlibh"

#define m 4

#define n 4

struct stype

{int x,y;

}stack[400];

int mg[m+2][n+2];

int zx[9],zy[9];

void printlj(int TOP)

{int i;

for(i=1;i<=TOP;i++)

{printf("(%d,%d)",stack[i]x,stack[i]y);

}

}

void mglj()

{int i,j,x,y,top,find,v;

top=1;stack[1]x=1;stack[1]y=1;find=0; mg[1][1]=-1;

while(top>=1&&!find)

{x=stack[top]x; y=stack[top]y;

for(v=1;v<=8;v++)

{i=x+zx[v];

j=y+zy[v];

if(mg[i][j]==0)

{top++;

stack[top]x=i;

stack[top]y=j;

mg[i][j]=-1;

break;

}

if(v==8) top--;

}

if((stack[top]x ==m)&&(stack[top]y ==n))

{printlj(top);

find=1;

}

}

if(!find) printf("no way\n");

}

void main()

{int i,j;

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

scanf("%d",&mg[i][j]);

for(i=0;i<=m+1;i++)

{mg[i][0]=1;mg[i][n+1]=1;}

for(j=0;j<=n+1;j++)

{mg[0][j]=1;mg[m+1][j]=1;}

zx[1]=-1;zx[2]=-1;zx[3]=0;zx[4]=1;zx[5]=1;zx[6]=1;zx[7]=0;zx[8]=-1;

zy[1]=0;zy[2]=1;zy[3]=1;zy[4]=1;zy[5]=0;zy[6]=-1;zy[7]=-1;zy[8]=-1;

mglj();

}

解析:

我看了一下,算法应该是一样的,下面是我以前用C++写的

相信你能看得懂

/

/迷宫求解

作者:baihacker/

/时间:11102006/

/

/class:

Matrix:矩阵类

offsets:搜索偏移

enum directions:四个方向

struct item:搜索节点

Migong:迷宫类

1创建一个Migong对象

2使用用Create方法输入数据

3使用Solve方法进行求解

4ShowSolve方法显示解

5可以重复使用Create方法

6入口只能在左上角

7默认出口在右下角

ShowAllPath:穷举所有的路径

备注:

由于算法原因,这里的所有路径应该是指

介于:

a如果两条路存在某个点不同那么就是不同的路

b如果在一条路中去掉一个或者一个以上的圈,那么他们是同一条路

之间意义上的路

/

#include <iostream>

#include <stack>

#include <vector>

using namespace std;

#ifndef MIGONG_H

#define MIGONG_H

/

/矩阵类

/

class Matrix{

int m;

int row, col;

bool iscreate;

public:

Matrix(){m=0;iscreate=false;};

~Matrix() {Release();};

bool Create(int, int);

int& operator () (int, int);

int GetRow(){return row;};

int GetCol(){return col;};

void Release();

void Show(char, char );

};

bool Matrix::Create(int r, int c)

{

if( r<=0 || c<=0) return false;

Release();

row = r;

col = c;

m = new int[rowcol];

for (int i=0;i<rowcol;i++)

{

(m+i) = 0;

}

iscreate = true;

return true;

}

int& Matrix::operator ()(int r, int c)

{

return (m+rcol+c);

}

void Matrix::Release()

{

if (iscreate)

{

row = col = 0;

if (m) delete[] m;

m = 0;

}

iscreate = false;

}

void Matrix::Show(char blk='#', char nblk=' ')

{

int i, j;

for (i=0;i<row;i++)

{

for (j=0;j<col;j++)

{

if ((m+icol+j) == 0)

cout<<nblk;

else

cout<<blk;

}

cout<<endl;

}

}

/

迷宫相关数据结构的定义/

/

struct offsets{

int a, b;

};

enum directions{

_S = 0,

_E,

_N,

_W

};

struct item{

int row, col, dir;

};

class Migong{

static offsets move[4];

Matrix maze;

Matrix mark;

int row;

int col;

int desr;

int desc;

stack<item> stk;

bool iscreate;

int pathlength;

bool GetPath();

bool IsInPath(int, int);

public:

Migong(){issolved=false;result=0;pathlength=row=col=0;iscreate=false;};

~Migong(){Release();};

bool Create(int , int , int , int , int );

void Solve();

void Release();

void OutputMaze();

void ShowSolve(char, char );

public:

bool issolved;

item result;

};

offsets Migong::move[4]={ {1, 0}, {0, 1},

{-1, 0}, {0, -1}};

迷宫数据应该是不含边框的

bool Migong::Create(int m, int r, int c, int desrow=-1, int descol=-1)

{

if (r<=0 || c<=0) return false;

Release();

if (desrow==-1 || descol==-1)

{

desr = r;

desc = c;

}

else

{

desr = desrow;

desc = descol;

}

row = r;

col = c;

mazeCreate(r+2, c+2);

markCreate(r+2, c+2);

int i, j;

for (i=0;i<r+2;i++)

{

for (j=0;j<c+2;j++)

{

if (j==0 || j==c+1 || i==0 || i==r+1)

{

mark(i, j) = maze(i, j) = 1;

}else

{

mark(i, j) = 0;

maze(i, j) = m[((i-1)col+j-1)];

}

}

}

return iscreate = true;

}

bool Migong::GetPath()

{

mark(1,1) = 1;

item temp;

tempcol = 1;

temprow = 1;

tempdir = _S;

stkpush(temp);

while (!stkempty())

{

temp = stktop();

stkpop();

int i = temprow;

int j = tempcol;

int d = tempdir;

while (d<4)

{根据当前点的状态确定下一个搜索点

int g = i + move[d]a;

int h = j + move[d]b;

if (g==desr && h==desc)

{

return true;

}

如果这个点不是障碍点且没有被搜索过那么可以对这个点进行搜索

if (maze(g, h)==0 && mark(g, h)==0)

{

mark(g, h) = 1;

temprow = g;

tempcol = h;

tempdir = d+1;

stkpush(temp);

i = g;

j = h;

d = _S;对一下个点进行搜索

}

else d++;

}

}

return false;

}

void Migong::Solve()

{

issolved = GetPath();

if (issolved)

{

pathlength = stksize();

result = new item[pathlength];

for (int i=0;i<pathlength;i++)

{

(result+i) = stktop();

stkpop();

cout<<"("<<((result+i))row<<","<<((result+i))col<<")"<<endl;

}

}

while (!stkempty())

stkpop();

}

void Migong::Release()

{

if (iscreate)

{

mazeRelease();

markRelease();

row=col=0;

if (result)

delete [] result;

result = 0;

while (!stkempty())

stkpop();

}

iscreate = false;

issolved = false;

pathlength = 0;

}

void Migong::OutputMaze()

{

if (!iscreate) return;

mazeShow();

}

bool Migong::IsInPath(int r, int c)

{

if (!iscreate || !issolved)

return false;

item temp;

for (int i=0;i<pathlength;i++)

{

temp = (result+i);

if ((temprow==r) && (tempcol==c))

return true;

}

return false;

}

void Migong::ShowSolve(char blk='#',char s='o')

{

if (!iscreate) return;

if (!issolved)

{

cout<<"无解"<<endl;

}

else

{

int i, j;

for (i=0;i<row+2;i++)

{

for (j=0;j<col+2;j++)

{

if ((i==1 && j==1) || (i==desr && j==desc))

{

cout<<s;

}

else if (maze(i, j) == 1)

{

cout<<blk;

}else

{

if (IsInPath(i, j))

cout<<s;

else

cout<<' ';

}

}

cout<<endl;

}

}

}

穷举所有路径

offsets move[4]={ {1, 0}, {0, 1},

{-1, 0}, {0, -1}};

struct node

{

int row,col;

};

vector<node> path;

int count;

bool IsReachable( Matrix& maze, Matrix& mark, node beg, node des)

{

if (begrow==desrow&&begcol==descol)

{如果达到的话那么显示路径

count++;

cout<<"第"<<count<<"条路径:"<<endl;

for (int i=0;i<pathsize();i++)

cout<<"("<<path[i]row<<","<<path[i]col<<")";

cout<<"("<<desrow<<","<<descol<<")";

cout<<endl;

return false;

}

if (maze(begrow, begcol)==1 || mark(begrow, begcol)==1)

{

return false;

}

pathpush_back(beg);

mark(begrow, begcol) = 1;

node nextnode;

for (int i=_S;i<_W+1;i++)

{

nextnoderow = begrow + move[i]a;

nextnodecol = begcol + move[i]b;

IsReachable(maze, mark, nextnode, des);

}

pathresize(pathsize()-1);

mark(begrow, begcol) = 0;

return false;如果不是穷举的话应该根据for循环的结果重新设置返回值

}

/

参数maze,mark为迷宫长宽均加二的矩阵

desr,desc为出口点

/

void FindAllPath( Matrix& maze, Matrix& mark, int desr, int desc)

{

node first, last;

firstrow = 1;

firstcol = 1;

lastrow = desr;

lastcol = desc;

IsReachable(maze, mark, first, last);

pathclear();

}

/

m迷宫矩阵数据

r,c行和列的大小

desr,desc目标位置

/

void ShowAllPath(int m, int r, int c, int desr=-1, int desc=-1)

{

Matrix maze, mark;

mazeCreate(r+2, c+2);

markCreate(r+2, c+2);

if (desr==-1 || desc==-1)

{

desr = r;

desc = c;

}

int i, j;

for (i=0;i<r+2;i++)

{

for (j=0;j<c+2;j++)

{

if (j==0 || j==c+1 || i==0 || i==r+1)

{

mark(i, j) = maze(i, j) = 1;

}else{

mark(i, j) = 0;

maze(i, j) = m[((i-1)c+j-1)];

}

}

}

count = 0;

FindAllPath(maze, mark, desr, desc);

mazeRelease();

markRelease();

}

#endif

一般迷宫寻路可以用递归的算法,或者用先进后出的栈数据结构实现

用的是深度优先的算法,可以寻找到走出迷宫的路径

但本题要求求出最短的路径,这就要使用广度优先的算法

一般在程序中需要用到先进先出的队列数据结构

下面是程序的代码,主要原理是用到

quei,quej和prep三个数组来构成队列

分别储存路径的行,列坐标和上一个节点在队列中的位置

大致算法如下,右三个嵌套的循环实现

首先是第一个节点进入队列

当队列不空(循环1)

   遍历队列中每节点(循环2)

       将八个方向能够走的节点加入队列(循环3)

   旧的节点出列

#include<iostream>

#include<ctime> 

using namespace std; 

#define MAXNUM 50

void main() 

{

int m,n,i,j,x;

cout<<"请输入迷宫大小"<<endl;

cin>>m>>n;

int maze[MAXNUM][MAXNUM];

srand((int)time(NULL));

for(i=0;i<=m+1;i++){

for(j=0;j<=n+1;j++){

if(i==0||j==0||i==m+1||j==n+1)

maze[i][j]=1;

else

{

x=rand()%1000;

if(x>700){maze[i][j]=1;} //控制矩阵中1的个数,太多1迷宫很容易走不通

else{maze[i][j]=0;}

}

cout<<maze[i][j]<<' ';

}

cout<<endl;

}

//以上是输入和迷宫生成,一下是走迷宫

    int move[8][2]={0,1,1,0,0,-1,-1,0,1,1,-1,1,-1,-1,1,-1};

int quei=new int[mn];//储存行坐标队列

int quej=new int[mn];//储存列坐标队列

int prep=new int[mn];//储存之前一步在队列中的位置

int head,rear,length;//队列头,队列尾,队列长度

head=0;rear=1;length=1;

quei[head]=1;quej[head]=1;prep[head]=-1;//入口位置进队列

int pos;//当前节点在队列中的位置,

int ii,jj,ni,nj;//当前节点的坐标,新节点的坐标

int dir;//移动方向

if(maze[1][1]==1)length=0;//第一点就不能通过

else maze[1][1]=1;

while(length)//队列非空继续

{

for(pos=head;pos<head+length;pos++)//寻找这一层所有节点

{

ii=quei[pos];jj=quej[pos];//当前位置坐标

if(ii==m&&jj==n)break;

for(dir=0;dir<8;dir++)//寻找8个方向

{

ni=ii+move[dir][0];nj=jj+move[dir][1];//新坐标

if(maze[ni][nj]==0)//如果没有走过

{

quei[rear]=ni;quej[rear]=nj;prep[rear]=pos;//新节点入队

rear=rear+1;

maze[ni][nj]=1;//标记已经走过

}

}

}

if(ii==m&&jj==n)break;

head=head+length;

length=rear-head;//这一层节点出列

}

if(ii==m&&jj==n)

{

while(pos!=-1)

{

cout<<'('<<quei[pos]<<','<<quej[pos]<<')';

pos=prep[pos];

if (pos!=-1)cout<<',';

}

}

else

{

cout<<"THERE IS NO PATH"<<endl;

}

delete []quei;

delete []quej;

delete []prep;

}

请把C++的注释风格改成风格的,两个程序都调试通过!

////////////////////////////////////////////////////////////////////////////////

程序1

#include<stdioh>

#define N1 11

#define N2 10

int getpath(int maze[N1][N2])//在迷宫中探路的函数

{

int stack[N1N2][2];

int i,x=1,y=1,ok,top=0;//可通路径上第一个点(入口点)的坐标进入路径数组stack

stack[top][0]=x;

stack[top][1]=y;//循环探路。加1则向前,减1则退回一步

while (1)

{

ok=0;//标志能否向前

if (maze[x][y+1]==0)

{y=y+1;ok=1;}//向右

else

if (maze[x+1][y]==0)

{x=x+1;ok=1;}//向下

else

if (maze[x][y-1]==0)

{y=y-1;ok=1;}//向左

else

if (maze[x-1][y]==0)

{x=x-1;ok=1;}//向上

if (!ok)//4方向均不通

{

top--;

if (top==0)//栈空,无出路

{

printf("迷宫无出路\n");

return 0;

}

x=stack[top][0];//回退后路径上最后一个点的X坐标存入X

y=stack[top][1];//回退后路径上最后一个点的Y坐标存入Y

}

else//若能走通,

{

maze[x][y]=2;//将已经走过的点标记为2

top++;

stack[top][0]=x;//新进入的点的X坐标进入路径数组

stack[top][1]=y;//新进入的点的Y坐标进入路径数组

if (x==N1-2&&y==N2-2)//到达出口

{

printf("路径为:\n");

for(i=0;i<top;i++)

{

printf("(%d,%d)-->",stack[i][0],stack[i][1]);

if((i+1)%5==0)

printf("\n");

}

printf("(%d,%d)\n",stack[top][0],stack[top][1]);

return 1;

}

}

}

}

void printmaze(maze)//输出迷宫数组函数

int maze[N1][N2];

{

int i,j;

printf("迷宫数组为:\n");

for (i=0;i<N1;i++)

{

for (j=0;j<N2;j++)

printf("%2d",maze[i][j]);

printf("\n");

}

}

main()

{

int A[N1][N2]=

{

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,0,0,1,1,0,1,1,

1,0,1,1,1,0,0,1,0,1,

1,0,0,0,1,0,0,0,0,1,

1,0,1,0,0,0,1,0,1,1,

1,0,1,1,1,1,0,0,1,1,

1,1,1,0,0,0,1,0,1,1,

1,1,1,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,1,1};

printmaze(A);

getpath(A);

}

//////////////////////////////////////////////////////////////////////

程序2

#include<stdioh>

#include<stdlibh>

#define OVERFLOW -1

#define MAX 100

#define N 11

typedef struct

{

int x;

int y;

int d;

}Data;

typedef struct

{

int pos;

Data data[MAX];

}SNode,Stack;

Stack InitStack()

{

Stack pStack;

pStack=(Stack)malloc(sizeof(SNode));

if(!pStack)

exit(OVERFLOW);

pStack->pos=-1;

return pStack;

}

int IsEmpty(Stack stack)

{

return stack->pos==-1;

}

void Push(Stack pStack,Data x)

{

if(pStack->pos>=MAX-1)

exit(OVERFLOW);

else

{

pStack->pos++;

pStack->data[pStack->pos]=x;

}

}

void Pop(Stack pStack)

{

if(pStack->pos==-1)

exit(OVERFLOW);

else

pStack->pos--;

}

Data GetTop(Stack pStack)

{

return pStack->data[pStack->pos];

}

Data SetStackElem(int x,int y,int d)

{

Data element;

elementx=x;

elementy=y;

elementd=d;

return element;

}

void DisplayPath(Stack pStack)

{

Data element;

printf("The path is:\n");

while(!IsEmpty(pStack)) //多了个;

{

element=GetTop(pStack);

Pop(pStack);

printf("The node is: %d %d\n",elementx,elementy);

}

}

void MazePath(int maze[][N],int direction[][2],int x1,int y1,int x2,int y2)

{

int i,j,k,g,h;

Stack pStack;

Data element;

pStack=InitStack();

maze[x1][y1]=2;

Push(pStack,SetStackElem(x1,y1,0));

while(!IsEmpty(pStack))//以前多了一个;

{

element=GetTop(pStack);

Pop(pStack);

i=elementx;

j=elementy;

k = elementd;

while (k<=3)//用while

{

g=i+direction[k][0];

h=j+direction[k][1];

if(g==x2&&h==y2&&maze[g][h]==0)

{

Push(pStack,SetStackElem(i,j,k));//把路径上最后一个点放入

DisplayPath(pStack);

return;//怎么会有返回值

}

if(maze[g][h]==0)

{

maze[g][h]=2;

Push(pStack,SetStackElem(i,j,k+1));

i=g;

j=h;

k=0;

}

else

k++;

}

}

printf("The path has not been found\n");

}

void main()

{

int direction[][2]={0,1,1,0,0,-1,-1,0};

int maze[][N]=

{

1,1,1,1,1,1,1,1,1,1,1,

1,0,1,0,0,1,1,1,0,0,1,

1,0,0,0,0,0,1,0,0,1,1,

1,0,1,1,1,0,0,0,1,1,1,

1,0,0,0,1,0,1,1,0,1,1,

1,1,0,0,1,0,1,1,0,0,1,

1,1,1,0,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,1,1,1

};

MazePath(maze,direction,1,1,6,9);

}

核心算法是搜索,这里如果要求用栈实现那就是深度优先搜索。 如果他不指定是用栈, 那么用队列来做就是广度优先搜索。

正常的深度优先搜索是可以用递归来实现的, 即然要求你非递归 你可以用栈来模拟递归的效果,毕竟函数的递归调用本质也是用栈来实现的

// Migong_Queuecpp : 定义控制台应用程序的入口点。

#include "stdafxh"

#include "stdlibh"

#define MaxSize 100

struct

{

int i,j;

int pre;

}Qu[MaxSize];

int front = -1,rear = -1;

int mgpath(int ,int ,int ,int ,int);

void print(int);

int _tmain(int argc, _TCHAR argv[])

{

int l,h;

FILE migong=fopen("C:\\Users\\Administrator\\Documents\\Visual Studio 2010\\Projects\\数据结构实验\\Migong_Queue\\migongtxt","r");

if(migong==NULL)

{

printf("Can't open the file!!!");

exit(0);

}

char ch=fgetc(migong);

l=0;

while(ch!='\n')

{

if(ch!=',')

l++;

ch=fgetc(migong);

}//l为迷宫的长度

rewind(migong);

//接下来是算出迷宫的高度h!~~

h=0;

ch=fgetc(migong);

while(!feof(migong))

{

if(ch=='\n')

h++;

ch=fgetc(migong);

}

if(l<5||h<5)

{

printf("It's too small!");

exit(0);

}

rewind(migong);

int mg=(int )malloc(sizeof(int )h);

for(int h_=0;h_<h;h_++)

{

mg[h_]=(int )malloc(sizeof(int)l);

}

for(int h_=0;h_<h;h_++)

{

for(int l_=0;l_<l;)

{

ch=fgetc(migong);

if(ch!=',')

{mg[h_][l_]=ch-'0';l_++;}

}

ch=fgetc(migong);

}

fclose(migong);

printf("The map is presented as follows:\n");

for(int _x=0;_x<h;_x++)

for(int _y=0;_y<l;_y++)

{

printf("%d ",mg[_x][_y]);

if((_y+1)%l==0)

printf("\n");

}

mgpath(mg,1,1,8,8);

return 0;

}

int mgpath(int mg,int xi,int yi,int xe,int ye)

{

int i,j,find=0,di;

rear++;

Qu[rear]i=xi;

Qu[rear]j=yi;

Qu[rear]pre=-1;

mg[xi][yi]=-1;

while(front<=rear&&!find)

{

front++;

i=Qu[front]i;j=Qu[front]j;

if(i==xe&&j==ye)

{

find=1;

print(front);

return 1;

}

for(di=0;di<4;di++)

{

switch(di)

{

case 0:i=Qu[front]i-1;j=Qu[front]j;break;

case 1:i=Qu[front]i;j=Qu[front]j+1;break;

case 2:i=Qu[front]i+1;j=Qu[front]j;break;

case 3:i=Qu[front]i;j=Qu[front]j-1;break;

}

if(mg[i][j]==0)

{

rear++;

Qu[rear]i=i;Qu[rear]j=j;

Qu[rear]pre=front;

mg[i][j]=-1;

}

}

}

return 0;

}

void print(int front)

{

int k=front,j,ns=0;

printf("\n");

do

{

j=k;

k=Qu[k]pre;

Qu[j]pre=-1;

}while(k!=0);

printf("迷宫路径如下:\n");

k=0;

while(k<MaxSize)

{

if(Qu[k]pre==-1)

{

ns++;

printf("\t(%d,%d)",Qu[k]i,Qu[k]j);

if(ns%5==0)printf("\n");

}

k++;

}

printf("\n");

}

我是从文件中读取迷宫数组的!

你也可以改为直接输入!

希望对你有帮助!谢谢!

以上就是关于数据结构 迷宫问题全部的内容,包括:数据结构 迷宫问题、数据结构课程设计的迷宫问题~~~~急!!!、求C语言迷宫程序的解释说明!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9686798.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存