迷宫寻路问题探索

这篇博客探讨了如何解决迷宫寻路问题,通过编写C++和C语言版的算法,利用栈进行路径搜索。文章提供了详细的代码实现,包括初始化栈、判断条件以及更新路径方向的逻辑。
摘要由CSDN通过智能技术生成

这学期的《程序设计专题》看来不是太水,给的项目是写一个迷宫寻路算法,也不知对不对,第一节课下去就给搞了一个。

#include <iostream>
#include <memory>
#include <stack>
int map[20][20];//1-permit 0-not 
int n, m;
struct point
{
int x, y;
bool d1, d2, d3, d4;
};
using namespace std;
stack<point> s, t;
int find()
{
bool d1 = false, d2 = false, d3 = false, d4 = false;
int x = 0, y = 0;
do{
if (map[x][y] == 1&&(s.empty()||s.top().x!=x||s.top().y!=y))
{
point p;
p.x = x; p.y = y;
p.d1 = d1;
p.d2 = d2;
p.d3 = d3;
p.d4 = d4;
s.push(p);


if (x == n - 1 && y == m - 1)
return 1;
}
{
x = s.top().x;
y = s.top().y;
d1 = false;
d2 = false;
d3 = false;
d4 = false;
if (!s.empty() && !(s.top().d1&&s.top().d2&&s.top().d3&&s.top().d4))
{
if (!s.top().d1&&x<n - 1){ x++; s.top().d1 = true; d3 = true; }
else if (!s.top().d2&&y<m - 1) { y++; s.top().d2 = true; d4 = true; }
else if (!s.top().d3&&x>0) { x--; s.top().d3 = true; d1 = true; }
else if (!s.top().d4&&y>0) { y--; s.top().d4 = true; d2 = true; }
else {
s.pop();
if (s.empty())return 0;
else { x = s.top().x, y = s.top().y; }
}
}
else if (!s.empty() && (s.top().d1&&s.top().d2&&s.top().d3&&s.top().d4))
{
s.pop();
if (s.empty())return 0;
else { x = s.top().x, y = s.top().y; }
}
}
} while (!s.empty());
return 0;
}
int main(int argc, char *argv[])
{


int repeat;


cin >> repeat;
for (int r = 0; r<repeat; r++)
{
while (!s.empty())
s.pop();
memset(map, 0, sizeof(map));
cin >> n >> m;
for (int i = 0; i<n; i++)
for (int j = 0; j<m; j++)
{
cin >> map[j][i];
}
find();
cout << "path:" << endl;


while (!s.empty())
{
t.push(s.top());
s.pop();
}
while (!t.empty())
{
cout << "x:" << t.top().x << " y:" << t.top().y << endl; t.pop();
}


}
system("PAUSE");
return EXIT_SUCCESS;
}

好,再来个C语言版

stack.h:

#define DATATYPE point
#define MAXNUM 50
#define BOOL unsigned int
#define TRUE 1
#define FALSE 0
#define EXIT_SUCCESS 0;
#ifndef NULL
#define NULL 0
#endif // !NULL
#include <memory.h>
typedef struct
{
int x, y;
BOOL d1, d2, d3, d4;
}point;


void copy(point* des, point* src)
{
des->d1 = src->d1;
des->d2 = src->d2;
des->d3 = src->d3;
des->d4 = src->d4;
des->x = src->x;
des->y = src->y;
}


typedef struct
{
DATATYPE data[MAXNUM];
DATATYPE* top;
}stack;


BOOL initstack(stack* s)
{
s->top = NULL;
memset(s->data, 0, sizeof(DATATYPE)*MAXNUM);
return TRUE;
}


BOOL empty(stack* s)
{
return (s->top == NULL);
}


BOOL pop(stack* s)
{
if (empty(s))return FALSE;
if (s->top == s->data)s->top = NULL;
else s->top--;
return TRUE;
}


BOOL push(stack*s, DATATYPE* d)
{
  if (s->top == NULL)s->top = s->data;else  s->top++;
copy(s->top, d);
return TRUE;
}

main.c:

#include <stdio.h>
#include "stack.h"
int map[20][20];//1-permit 0-not 
int n, m;
stack s, t;
int find()
{
point p;
BOOL d1 = FALSE, d2 = FALSE, d3 = FALSE, d4 = FALSE;
int x = 0, y = 0;
do{
if (map[x][y] == 1 && (empty(&s) || s.top->x != x || s.top->y != y))
{
p.x = x; p.y = y;
p.d1 = d1;
p.d2 = d2;
p.d3 = d3;
p.d4 = d4;
push(&s, &p);


if (x == n - 1 && y == m - 1)
return 1;
}
x = s.top->x;
y = s.top->y;
d1 = FALSE;
d2 = FALSE;
d3 = FALSE;
d4 = FALSE;
if (!empty(&s) && !(s.top->d1&&s.top->d2&&s.top->d3&&s.top->d4))
{
if (!s.top->d1&&x<n - 1){ x++; s.top->d1 = TRUE; d3 = TRUE; }
else if (!s.top->d2&&y<m - 1) { y++; s.top->d2 = TRUE; d4 = TRUE; }
else if (!s.top->d3&&x>0) { x--; s.top->d3 = TRUE; d1 = TRUE; }
else if (!s.top->d4&&y>0) { y--; s.top->d4 = TRUE; d2 = TRUE; }
else {
pop(&s);
if (empty(&s))return 0;
else { x = s.top->x, y = s.top->y; }
}
}
else if (!empty(&s) && (s.top->d1&&s.top->d2&&s.top->d3&&s.top->d4))
{
pop(&s);
if (empty(&s))return 0;
else { x = s.top->x, y = s.top->y; }
}
} while (!empty(&s));
return 0;
}
int main(int argc, char *argv[])
{


int repeat, r, i, j;
initstack(&s);
scanf("%d", &repeat);
for (r = 0; r<repeat; r++)
{
while (!empty(&s))
pop(&s);
memset(map, 0, sizeof(map));
scanf("%d%d", &n, &m);
for (i = 0; i<n; i++)
for (j = 0; j<m; j++)
{
scanf("%d",&map[j][i]);
}
find();
printf("path:\n");


while (!empty(&s))
{
push(&t,s.top);
pop(&s);
}
while (!empty(&t))
{
printf( "x:%d y:%d\n",t.top->x,t.top->y); 
pop(&t);
}


}
return EXIT_SUCCESS;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A*算法是一种常用的启发式搜索算法,用于解决迷宫寻路问题。它通过评估每个节点的代价函数来选择下一个要探索的节点,以找到最优路径。 以下是使用Python语言实现A*算法求解迷宫寻路问题的步骤: 1. 定义迷宫的数据结构:可以使用二维数组或者矩阵来表示迷宫,其中0表示可通行的路径,1表示墙壁或障碍物。 2. 定义节点类:每个节点包含坐标信息、父节点、代价函数等属性。 3. 实现A*算法: - 初始化起始节点和目标节点。 - 创建两个列表open_list和closed_list,分别用于存储待探索和已探索的节点。 - 将起始节点加入open_list。 - 循环执行以下步骤,直到找到目标节点或open_list为空: - 从open_list中选择代价函数最小的节点作为当前节点。 - 将当前节点从open_list中移除,并加入closed_list。 - 对当前节点的相邻节点进行遍历: - 如果相邻节点是墙壁或已在closed_list中,则忽略。 - 如果相邻节点不在open_list中,则将其加入open_list,并设置其父节点为当前节点,并计算代价函数。 - 如果相邻节点已在open_list中,比较当前路径和之前路径的代价函数,如果当前路径更优,则更新相邻节点的父节点和代价函数。 - 如果open_list为空,则表示无法找到路径。 - 如果找到目标节点,从目标节点开始回溯父节点,直到回溯到起始节点,即可得到最优路径。 4. 实现迷宫生成和可视化:可以使用matplotlib等库来生成迷宫,并将最优路径可视化展示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值