迷宫(利用栈)

一、思路(回溯)

我们拿个例子来举:

0   0   0   0   0   0
0   0   1   1   1   0
0   0   1   0   1   0
0   0   1   1   1   1
0   0   1   0   0   0
0   0   1   0   0   0

我们把入口改为2,接下来走过的地方依次相加,并将走过的横纵坐标入栈;

0   0   0   0   0   0
0   0   6   7   8   0
0   0   5   0   9   0
0   0   4   1  10 11
0   0   3   0   0   0
0   0   2   0   0   0

虽然我们成功走出但是这不是最近的路线,所以我们再进行出栈,每出一次进行探测,看周围有1或者大于等于自身加2的值;

0   0   0   0   0   0
0   0   6   7   8   0
0   0   5   0   7   0
0   0   4   5   6   7
0   0   3   0   0   0
0   0   2   0   0   0

此时便可发现找到最近的出口,因为此时的出栈即是路线。

二、源代码

1、Maze.h(Stack.h参考博客中的栈)

#ifndef _MAZE__H_
#define _MAZE__H_

#include "Stack.h"

#define N 6

typedef struct Pos
{
	int _row;
	int _col;
}Pos;

int GetPath(int maze[N][N], int row, int col);
void PrintMaze(int maze[N][N]);

#endif

2、Maze.c

#include "Maze.h"
//找迷宫路线
int GetPath(int maze[N][N], int row, int col)
{
	int n = 2, tmp = 0, x = row, y = col;
	maze[row][col] = n;
	Stack s;
	StackInit(&s, 36);
	StackPush(&s,  row,  col);
	while (StackEmpty(&s))
	{
		if ((row == 0 || row == N - 1 || col == 0 || col == N - 1) && row != x&&col != y)
			tmp = 1;
		if (maze[row - 1][col] == 1 || ((maze[row][col] + 1) < maze[row - 1][col]))
		{
			if (row - 1 != 0)
			{
				StackPush(&s, row - 1, col);
				maze[--row][col] = ++n;
			}
			else
			{
				StackPop(&s);
				row = StackTop(&s)._row;
				col = StackTop(&s)._col;
				--n;
			}
		}
		else if (maze[row][col + 1] == 1 || ((maze[row][col] + 1) < maze[row][col + 1]))
		{
			if (col + 1 != N)
			{
				StackPush(&s, row, col + 1);
				maze[row][++col] = ++n;
			}
			else
			{
				StackPop(&s);
				row = StackTop(&s)._row;
				col = StackTop(&s)._col;
				--n;
			}
		}
		else if (maze[row][col - 1] == 1 || ((maze[row][col] + 1) < maze[row][col - 1]))
		{
			if (col - 1 != 0)
			{
				StackPush(&s, row, col - 1);
				maze[row][--col] = ++n;
			}
			else
			{
				StackPop(&s);
				row = StackTop(&s)._row;
				col = StackTop(&s)._col;
				--n;
			}
		}
		else if (maze[row + 1][col] == 1 || ((maze[row][col] + 1) < maze[row + 1][col]))
		{
			if (row + 1 != N)
			{
				StackPush(&s, row + 1, col);
				maze[++row][col] = ++n;
			}
			else
			{
				StackPop(&s);
				row = StackTop(&s)._row;
				col = StackTop(&s)._col;
				--n;
			}
		}
		else
		{
			StackPop(&s);
			row = StackTop(&s)._row;
			col = StackTop(&s)._col;
			--n;
		}
	}
	return tmp;
}
//打印迷宫
void PrintMaze(int maze[N][N])
{
	assert(maze);
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%-3d", maze[i][j]);
		}
		printf("\n");
	}
}

3、写一个测试(test.c)让代码跑起来并加以验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值