`

栈求迷宫问题

 
阅读更多

个人摸索写的代码,不保证严谨和安全性,仅供参考而已。

 

stack.h

/*
 * stack.h
 *
 *  Created on: 2012年8月20日
 *      Author: h
 */

#ifndef STACK_H_
#define STACK_H_

#define STACK_INIT_SIZE  10
#define STACK_INCREME_SIZE  10

//typedef int ElemType;

typedef struct
{
	ElemType *top;
	ElemType *base;
	int size;
} STACK;

STACK * initStack();

int push(STACK *s, ElemType *e);

int pop(STACK *s, ElemType *e);

int isEmpty(STACK *s);

void destoryStack(STACK *s);
#endif /* STACK_H_ */

 stack

/*
 * stack.c
 *
 *  Created on: 2012年8月20日
 *      Author: h
 */

#include "maze.h"
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>

STACK * initStack()
{
	STACK *s = (STACK *)malloc(sizeof(STACK));
	if (s == NULL)
		exit(0);

	s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	if (s->base == NULL)
		exit(0);

	//s->base = s->top;
	s->top=s->base;
	s->size = STACK_INIT_SIZE;
	return s;
}

void destoryStack(STACK *s)
{
	free(s->base);
	free(s);
}

int push(STACK *s, ElemType *e)
{
	if (s == NULL || e == NULL)
		return 0;

	if ((s->top - s->base) >= s->size)
	{
		s->base = (ElemType *)realloc(s->base,
				(s->size + STACK_INCREME_SIZE) * sizeof(ElemType));
		if (s == NULL)
			return 0;
		s->top = s->base + s->size;
		s->size = s->size + STACK_INCREME_SIZE;
	}
	*s->top = *e;
	s->top++;
	//s->top++ = *e
	return 1;
}

int pop(STACK *s, ElemType *e)
{
	if (s == NULL || e == NULL)
		return 0;

	if (s->top == s->base)
		return 0;
	s->top--;
	*e = *s->top;
	//*e = *--s->top
	return 1;
}

int isEmpty(STACK *s)
{
	return s->base == s->top ? 1 : 0;
}

 

 maze.h

/*
 * maze.h
 *
 *  Created on: 2012年8月21日
 *      Author: h
 */

#ifndef MAZE_H_
#define MAZE_H_

typedef struct
{
	int y, x;
} POS;
typedef struct
{
	int di;
	int sno;
	POS seat;
} ElemType;

int isPass(POS p, int item[][10]);

POS getNext(POS curr, int di);

void printMaze(POS curr, int item[][10]);
#endif /* MAZE_H_ */

 

maze.c

/*
 * maze.c
 *
 *  Created on: 2012年8月21日
 *      Author: h
 */
#include "maze.h"
#include <stdlib.h>
#include <stdio.h>
int isPass(POS p, int item[][10])
{
	return item[p.y][p.x] == 0 ? 1 : 0;
}

POS getNext(POS curr, int di)
{
	POS p = curr;
	switch (di)
	{
	case 0:
		p.x--;
		break;
	case 1:
		p.y++;
		break;
	case 2:
		p.x++;
		break;
	case 3:
		p.y--;
		break;
	}
	return p;
}

void printMaze(POS curr, int item[][10])
{
	int i, j;
	system("cls");
	printf("\n");
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (i == curr.y && j == curr.x)
			{
				printf("@");
				continue;
			}
			if (item[i][j] != 0)
				printf("%d",item[i][j]);
			else
				printf(" ");
		}
		printf("\n");
	}
}

 

main.c

/*
 * main.c
 *
 *  Created on: 2012年8月20日
 *      Author: h
 */

#include "maze.h"
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

static int item[10][10] =
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
static const POS inPos =
{ 1, 1 }, outPOS =
{ 8, 8 };

//求迷宫出口
int main(int argc, char **argv)
{
	ElemType e;
	POS currPos = inPos;
	int step = 1;
	STACK *s = initStack();
	do
	{
		if (isPass(currPos, item))
		{
			e.sno = step;
			e.seat = currPos;
			e.di = 0;
			push(s, &e);
			item[currPos.y][currPos.x] = 2;
			if (currPos.x == outPOS.x && currPos.y == outPOS.y)
			{
				printf("ok!\n");
				getch();
				break;
			}
			step++;
			printMaze(currPos, item);
			currPos = getNext(currPos, 0);
			getch();
		} else
		{
			pop(s, &e);
			if (e.di == 4 && !isEmpty(s))
			{
				item[currPos.y][currPos.x] = 3;
				pop(s, &e);
				currPos=e.seat;
			}
			if (e.di <= 3)
			{
				e.di++;
				push(s, &e);
				currPos = getNext(e.seat, e.di);
			}
		}
	} while (!isEmpty(s));
	return 1;
}

/*
 int main(int argc, char **argv)
 {

 int num = 1348, temp;

 STACK *s = initStack();
 while (num)
 {
 temp = num % 8;
 push(s, &temp);
 num /= 8;
 }
 printf("the result is \n");
 while (!isEmpty(s))
 {
 pop(s, &temp);
 printf("%d", temp);
 }
 printf("\n");
 destoryStack(s);
 return 1;
 }*/

 

分享到:
评论

相关推荐

    迷宫问题实验报告用栈解决迷宫问题

    《用栈解决迷宫问题的实验报告》 一、需求分析 在本次实验中,我们需要设计一个程序来解决迷宫问题。迷宫采用结构体Maze进行表示,其中包括以下关键属性: 1. pos:用于标记该位置是否存在障碍,通常用0表示通路,...

    用栈的方式实现迷宫的路径求解

    本文将详细介绍如何利用栈这一数据结构来解决迷宫问题,即寻找从迷宫入口到出口的可行路径。 #### 二、基础知识回顾 1. **栈**:栈是一种只能在一端进行插入或删除操作的线性表,其操作遵循先进后出的原则。 2. **...

    数据结构 栈实现迷宫问题

    根据提供的文件信息,本文将详细解释如何利用栈这种数据结构来解决迷宫问题,并通过具体的代码实现进行深入探讨。 ### 栈与迷宫问题 #### 1. 栈的概念 栈是一种特殊的线性表,其特点是只能在一端进行插入或删除...

    栈的思想解决迷宫问题

    用栈的思想解决迷宫问题,获得一条通路,迷宫是随机生成的,如果没有通路就显示无法通过

    栈,顺序栈迷宫问题

    表达式括号匹配配对判断问题,顺序栈的公用问题,迷宫问题

    使用栈解决迷宫路径问题

    使用栈解决迷宫问题。 迷宫求解是数据结构中一个经典的程序设计题,一般情况下采用的式穷举求解的方法,即从迷宫的入口出发,沿着某一方向前进,若能走通则继续前进,若不通需原路退回后改变方向继续前进,直到找到...

    用栈解决迷宫问题C语言描述

    本主题将探讨如何利用栈这一数据结构,用C语言解决迷宫问题。栈是一种后进先出(LIFO)的数据结构,适用于解决回溯问题,如迷宫中的路径寻找。 首先,我们要理解迷宫问题的基本设定:一个二维矩阵代表迷宫,其中1...

    迷宫问题的最短路径C语言实现(栈实现)

    迷宫问题最短路径C语言printf("最短路径如下:\n"); printf("长度: %d\n",minlen); printf("路径: "); for(k=0;k;k++) printf("(%d,%d) ",Path[k].i,Path[k].j); printf("\n"); return 0;

    c++ 栈 解决迷宫问题

    栈是一种后进先出(LIFO)的数据结构,非常适合用来解决迷宫问题,因为它可以有效地回溯路径。 首先,我们需要理解迷宫问题的基本设定:一个二维矩阵代表迷宫,其中1表示墙壁,0表示可通行的路径。目标是从起点...

    利用链式栈结构求迷宫问题所有解:回溯算法,两种输出形式数组输出和三元组输出

    在本文中,我们将深入探讨如何使用C语言,结合链式栈结构和回溯算法来解决迷宫问题,并提供两种不同的输出形式:数组输出和三元组输出。首先,我们需要了解迷宫问题的基本概念。 迷宫问题是一个经典的路径寻找问题...

    数据结构中用栈实现迷宫问题的c++代码

    用栈辅助实现迷宫问题的求解,通过随机数发生器产生迷宫图,程序显示求解步骤

    migong.rar_migong_数据结构 迷宫_栈的应用_迷宫 栈_迷宫问题

    标题中的“migong.rar_migong_数据结构 迷宫_栈的应用_迷宫 栈_迷宫问题”暗示了这是一个关于使用栈解决迷宫问题的案例。迷宫问题通常涉及到寻找从起点到终点的有效路径,而栈在这里起到了记录和回溯路径的作用。 ...

    数据结构栈和队列解决迷宫问题

    数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...

    C++栈实现迷宫问题

    题目如下:利用栈结构实现迷宫求解问题。迷宫求解问题如下: 心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,...

    迷宫问题的非递归算法(栈实现.rar_迷宫 栈_迷宫 问题 非递归 算法_迷宫 非递归_迷宫问题_迷宫问题栈

    在本主题中,我们将重点讨论如何利用非递归算法,特别是栈数据结构来解决迷宫问题。 首先,栈是一种后进先出(LIFO)的数据结构,适用于解决需要回溯的问题,例如深度优先搜索(DFS)。在迷宫问题中,我们可以将栈...

    用栈处理走迷宫问题的C语言代码

    这是一个用栈处理问题的例子,它处理的是走迷宫问题。

    基于栈实现的迷宫问题

    因此,在求迷宫通路的算法中采用“栈”进行求解。 迷宫构建 为了避免每走一步便需判断是否走出迷宫的麻烦,将所创建的迷宫用 1 包围起来。 位置搜索 每到一处,总让它按上、下、左、右 4 个方向试探下一个位置;...

    用栈求解迷宫问题---原创版

    这可是我自己写的,书上写的可是不对的,于是,我自己摸索写的,还是对的哦。。。

Global site tag (gtag.js) - Google Analytics