用栈来解决迷宫问题
给定迷宫起点和终点,寻找一条从起点到终点的路径。
要求搜寻策略是从起点开始按照“上、下、左、右”四个方向寻找终点,到下一个点继续按照“上、下、左、右”四个方面寻找,当该结点四个方向都搜寻完,但还没到终点时,退回到上一个点,直到找到终点或者没有路径。
比如上图从(1,1)开始,向上(0,1)不通,向下到(2,1);到了(2,1)后继续按“上、下、左、右”四个方面寻找,上已经走过,向下到(3,1);到(3,1)后上已经走过,下和左不通,向右到(3,2);到(3,2)四个方面都不通,回到(3,1)四个方向都不通,再回到(2,1),(1,1);到达(1,1)后下已经走过,左不通,继续向右走,重复这个过程最后到达(3,4)。
Input
第一行两个数m和n表示迷宫的行数和列数。迷宫大小不超过100×100
第二行四个数x1,y1,x2,y2分别表示起点和终点的坐标。
接下来是m行n列的数,用来表示迷宫,1表示墙,0表示通路。
Output
从起点到终点所经过的路径的坐标。如果不存在这样的路径则输出“No Path!”。
我不会用递归,要求是递归。
希望得到不同于网上查到的源代码,用于读懂代码。
只希望得到源代码和清晰的注释。(不要百度查到的代码)
必须用栈解决,深度搜索解决
不同于网上查到的源代码,
#include<stdio.h>
#include<stdlib.h>
#define maxsize 1000
typedef struct data
{
int x;
int y;
}DATA;
int ds[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int m,n,len=0;
int a[100][100];
DATA p[maxsize];
int dfs(int x, int y,int x2, int y2) {
p[len].x = x;
p[len].y = y;
len++;
a[x][y] = 2;
if (x == x2 && y == y2) {
return 1;
}
for (int i = 0; i < 4; i++) {
int tx = x + ds[i][0];
int ty = y + ds[i][1];
if (a[tx][ty]==0 && tx >= 0 && tx < m && ty >= 0 && ty < n) {
if (dfs(tx, ty, x2, y2))
return 1;
}
}
a[x][y] = 0;
len--;
return 0;
}
int main()
{
int x1,y1,x2,y2;
int i,j;
scanf("%d %d",&m,&n);
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
if (dfs(x1,y1,x2,y2))
{
for(i=0;i<len;i++)
{
printf("(%d,%d) ", p[i].x, p[i].y);
}
}
else
{
printf("No Path!");
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
maze=[
[1,1,1,1,1,1,1,1,1,1],
[1,0,1,0,1,1,1,1,1,1],
[1,0,0,0,1,1,1,1,1,1],
[1,0,1,0,1,1,1,1,1,1],
[1,0,1,0,1,1,1,1,1,1],
[1,0,1,0,0,0,0,1,1,1],
[1,0,0,0,1,1,0,0,1,1],
[1,0,1,1,0,0,1,0,1,1],
[1,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1],
] //迷宫转换成二维列表
dirs=[
lambda x,y:(x-1,y)
lambda x,y:(x+1,y)
lambda x,y:(x,y-1)
lambda x,y:(x,y+1)
]
def maze_path(x1,y1,x2,y2):
path=[]
path.append((x1,y1))
while len(path)>0 :
curnode=path[-1]
if curnode[0]==x2 and cuenode[1]==y2:
for p in path:
print(p)
return True
for dir in dirs:
nextnode=dir(curnode[0],cuenode[1])
if maze[nextnode[0]][nextnode[1]]==0:
path.append(nextnode)
maze[nextnode[0]][nextnode[1]]=1
break
else:
path.pop()
else:
print('没有路')
return False
maze_path(1,1,8,8)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct {
int x;
int y;
int pre; //记录该结点的父结点(来源)
}position;
typedef struct my_queue {
position *que;
int front;
int last;
}Queue;
Queue* create_emptyqueue();
int isempty(Queue *q);
void push_queue(Queue *q, position x);
void pop_queue(Queue *q);
int a[100][100];
Queue *bfs(position st);
void print(Queue *q, position ans);
position begin, end;
int m, n, flag = 0;
int main() {
int i, j;
Queue *q;
scanf("%d%d", &m, &n);
scanf("%d%d%d%d", &begin.x, &begin.y, &end.x, &end.y);
begin.pre = -1;
for(i = 0; i < m; i++) {
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
}
q = bfs(begin);
if(!flag) printf("No Path!");
else {
print(q, q->que[q->front - 1]);
printf("(%d,%d)", end.x, end.y);
}
return 0;
}
Queue *create_emptyqueue() {
Queue *p;
p = (Queue*)malloc(sizeof(Queue));
if(p != NULL) {
p->que = (position*)malloc(10000*sizeof(position));
if(p->que != NULL) {
p->front = 0;
p->last = 0;
return p;
}
else free(p);
}
return NULL;
}
int isempty(Queue *q) {
return q->front == q->last;
}
void push_queue(Queue *q, position x) {
if(q->last + 1 == q->front)
printf("full\n");
else {
q->que[q->last] = x;
q->last = q->last + 1;
}
}
void pop_queue(Queue *q) {
if(q->front == q->last)
printf("empty\n");
else
q->front = q->front + 1;
}
Queue *bfs(position st) {
int pr, i;
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
position former, latter;
position t;
Queue *q = create_emptyqueue();
former = st;
push_queue(q, former);
a[former.x][former.y] = 1;
while(!isempty(q)) { //队列不为空,说明可能还有可走的路
latter = q->que[q->front];
pr = q->front;
pop_queue(q);
for(i = 0; i < 4; i++) {
t.x = latter.x + dir[i][0];
t.y = latter.y + dir[i][1];
t.pre = pr; //记录该结点的来源
if(t.x == end.x && t.y == end.y) {
flag = 1;
return q;
}
if(!a[t.x][t.y] && t.x >= 0 && t.x < m && t.y >= 0 && t.y < n) {
push_queue(q, t);
a[t.x][t.y] = 1;
}
}
}
return q;
}
void print(Queue *q, position ans) { //递归输出
if(ans.pre == -1) {
printf("(%d,%d)", ans.x, ans.y);
return ;
}
else {
print(q, q->que[ans.pre]);
printf("(%d,%d)", ans.x, ans.y);
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!