java中用队列求解迷宫问题_迷宫问题利用栈和队列求解(数据结构设计)

#include#define M 6

#define N 8

#define max 100

#define Max M*N

typedef struct //定义迷宫内坐标类型

{

int x,y;

}item;

typedef struct //顺序栈元素

{

int x,y,d;//d 下一步方向

}Elemtype;

typedef struct node // 栈的类型定义

{

Elemtype data[max];

int top;

}sqstack;

typedef struct //队列的类型定义

{ int x,y;

int pre;

}ElemType;

typedef struct

{ ElemType elem[Max];

int front,rear;

int len;

}SqQueue;

/* 栈函数 */

void InitStack(sqstack *s)//构造空栈

{

s->top=-1;

}

int Stackempty(sqstack s)//判断栈是否为空

{

if(s.top==-1)

return 1;

else

return 0;

}

void Push(sqstack *s, Elemtype e)//入栈

{

if(s->top==max-1)

{printf("full");return;}

s->top++;

s->data[s->top].x=e.x;

s->data[s->top].y=e.y;

s->data[s->top].d=e.d;

}

int Pop(sqstack *s,Elemtype *e)// 出栈

{

if(s->top==-1){printf("stack is empty\n");return 0;}

e->x=s->data[s->top].x;

e->y=s->data[s->top].y;

e->d=s->data[s->top].d;

s->top--;

}

void InitQueue(SqQueue *q) //队的初始化

{ q->front=q->rear=0;

q->len=0;

}

int QueueEmpty(SqQueue q) //判断队空

{ if (q.len==0)

return 1;

else return 0;

}

void GetHead (SqQueue q,ElemType *e)//读队头元素

{ if (q.len==0)

printf("Queue is empty\n");

else

*e=q.elem[q.front];

}

void EnQueue(SqQueue *q,ElemType e) //入队

{ if(q->len==Max)

printf("Queue is full\n");

else

{q->elem[q->rear].x=e.x;q->elem[q->rear].y=e.y;q->elem[q->rear].pre=e.pre;

q->rear=q->rear+1;

q->len++;

}

}

void DeQueue(SqQueue *q,ElemType *e) //出队

{ if(q->len==0)

printf("Queue is empty\n");

else

{e->x=q->elem[q->rear].x;e->y=q->elem[q->rear].y;e->pre=q->elem[q->rear].pre;

q->front=q->front+1;

q->len--;

}

}

void printpath2(SqQueue q)//输出迷宫路径,队列中保存的就是一条迷宫的通路

{ int i;

i=q.rear-1;

do

{printf("(%d,%d)i=(q.elem[i]).pre;

}

while(i!=-1);

printf("\n");

}

void mazepath2(int maze[M+2][N+2],item move[8]) //队列的迷宫求解

{ SqQueue q;

ElemType head,e;

int x,y,v,i,j;

InitQueue(&q); //队列的初始化

e.x=1;e.y=1;e.pre=-1;

EnQueue (&q,e);

maze[1][1]=-1;

while(!Queue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您解答。 首先,让我们来了解一下栈和队列的概念。 栈是一种后进先出(Last In First Out,LIFO)的数据结构,类似于一摞叠起来的盘子,最后放入的盘子最先取出,而先放入的盘子要等后面的盘子都取出后才能取出。 队列是一种先进先出(First In First Out,FIFO)的数据结构,类似于排队买东西,先来的人先买完离开,而后来的人要等前面的人都买完才能买。 接下来,我们就可以用栈和队列制造一个牛郎织女迷宫了。 首先,我们需要定义一个迷宫的地图,可以用一个二维数组来表示。假设迷宫地图如下: ``` int[,] map = new int[10, 10] { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 1, 1, 1, 1, 1, 1, 0, 1}, {1, 0, 1, 0, 0, 0, 0, 1, 0, 1}, {1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, {1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, {1, 0, 1, 0, 0, 0, 0, 1, 0, 1}, {1, 0, 1, 1, 1, 1, 1, 1, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, }; ``` 其中,1 表示墙壁,0 表示通路。 接下来,我们可以用栈或队列来实现搜索迷宫的算法,找到从起点到终点的路径。 以队列为例,我们可以用一个结构体来表示每个节点的坐标和走到该节点的步数: ``` struct Node { public int x, y, step; } ``` 我们可以从起点开始,将起点入队,然后按照 BFS(广度优先搜索)的算法,依次取出队列中的节点,分别尝试向上、下、左、右四个方向走,如果该方向是通路且未被走过,则将该节点加入队列,并标记它已被走过,并记录走到该节点的步数。直到找到终点或队列为空。 完整代码如下: ``` using System; using System.Collections.Generic; class Program { static void Main(string[] args) { int[,] map = new int[10, 10] { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 1, 1, 1, 1, 1, 1, 0, 1}, {1, 0, 1, 0, 0, 0, 0, 1, 0, 1}, {1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, {1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, {1, 0, 1, 0, 0, 0, 0, 1, 0, 1}, {1, 0, 1, 1, 1, 1, 1, 1, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, }; Node start = new Node { x = 1, y = 1 }; Node end = new Node { x = 8, y = 8 }; int[,] direction = new int[4, 2] { {0, 1}, {0, -1}, {1, 0}, {-1, 0} }; Queue<Node> q = new Queue<Node>(); q.Enqueue(new Node { x = start.x, y = start.y, step = 0 }); while (q.Count > 0) { Node node = q.Dequeue(); if (node.x == end.x && node.y == end.y) { Console.WriteLine("最短步数为:" + node.step); break; } for (int i = 0; i < 4; i++) { int nx = node.x + direction[i, 0]; int ny = node.y + direction[i, 1]; if (map[nx, ny] == 0) { map[nx, ny] = 1; q.Enqueue(new Node { x = nx, y = ny, step = node.step + 1 }); } } } } } struct Node { public int x, y, step; } ``` 运行结果为: ``` 最短步数为:16 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值