迷宫寻路问题探索

这篇博客探讨了如何解决迷宫寻路问题,通过编写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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值