数据结构的学习之顺序栈走迷宫问题

数据结构的学习之顺序栈走迷宫问题

给定一数组表示的迷宫,1为可通,0为不可通。(此处用bool数组表示省点空间)。

具体实现的.h 文件如下


```cpp
#pragma once
#include <crtdbg.h>
#include <iostream>
#ifndef _STACK_H
#define _STACK_H

//typedef int Selemtype ;

#define  STACK_INIT_SIZE     80  
#define  STACKINCREMENT    10 
#define  OVERFLOW   -1 


using namespace std;

typedef struct {
	int ord;
	int seat[2];
	int di;
}Selemtype;


typedef struct stack
{
	Selemtype* base;
	Selemtype* top;
	int size;
}SqStack;



int Createstack(stack& S) ;

int GetTop(SqStack S, Selemtype& e);

int push(SqStack& S, Selemtype e);

void assign_e(Selemtype& e, int curstep, int curpos[], int  di);

int pop(stack& S, Selemtype& e); //删除一个栈顶元素并返回这个值

bool StackEmpty(stack S);

//以上为stack的基本函数


void assign_a(int a[], int a1, int b); 

void assign_e(Selemtype& e, int curstep, int curpos[], int  di);

bool equal(int a[], int b[]);

bool pass(stack S, int curpos[], bool maze[10][10]);

void move(int a[], int b);

int MazePath(bool maze[][10], int start[], int end[]);


#endif

以下为.cpp文件

#include "stack.h"

int Createstack(stack& S){
S.base = (Selemtype*)malloc(STACK_INIT_SIZE * sizeof(Selemtype));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.size = STACK_INIT_SIZE;
return 1;
}


int GetTop(SqStack S, Selemtype& e){
	if (S.top = S.base)return 0;
	e = *(S.top - 1);
	return 1;
}

int push(SqStack& S, Selemtype e){
	if (S.top - S.base >= S.size) {
		S.base = (Selemtype*)realloc(S.base, (STACKINCREMENT + S.size) * sizeof(Selemtype));
		if (!S.base) exit(OVERFLOW);
		S.top = S.base + S.size;
		S.size += STACKINCREMENT;
	}
	*S.top++ = e;
}

int pop(stack& S, Selemtype& e) {
	if (S.top == S.base) return 0;
	S.top--;
	assign_e(e, S.top->ord, S.top->seat, S.top->di);
	return 1;
}

bool StackEmpty(stack S) {
	if (S.base == S.top)
	{
		return 1;
	}
	else return 0;
}

void assign_a(int a[], int a1, int b) {
	a[0] = a1;
	a[1] = b;
}

void assign_e(Selemtype& e, int curstep, int curpos[], int  di){
	e.di = di; e.ord = curstep;
	e.seat[0] = curpos[0];
	e.seat[1] = curpos[1];
}
bool equal(int a[], int b[]){
	int* a1 = a; int* b1 = b;
	if ((*a1 == *b1) && (*(++b1) == *(++a1))) return 1;
	else return 0;
}

bool pass(stack S, int curpos[], bool maze[10][10]) {
	Selemtype* p = S.base;
	while (p != S.top) {
		if (equal(p->seat, curpos))  return 0;
		p++;
	}
	if (maze[curpos[0]][curpos[1]] == 1) return 0;

	return 1;
}

void move(int a[], int b) {
	switch (b)
	{
	case 1: a[1]++; break;
	case 2: a[0]++; break;
	case 3: a[1]--; break;
	case 4:	a[0]--; break;
	}
}

void MarkPrint(int a, int b, bool maze[][10]) {
	maze[a][b] = 1;
}

void showthepath(stack S, int end[]) {
	Selemtype* p = S.base;
	while (p != S.top)
	{
		cout << "--->"<< p->seat[0] << "and" << p->seat[1] ;
		p++;
	}
}


bool MazePath(bool maze[][10], int start[], int end[]) {
	stack S;	Createstack(S);		int curpos[2] = { -1,-1 };	memcpy(curpos, start, sizeof(curpos));
	int curstep = 1;	 Selemtype e; //此处的e为下一个要去的地方,用来试水的
	do {
		if (pass(S, curpos, maze)) {//如果能过
			assign_e(e, curstep, curpos, 1);
			push(S, e);
			if (equal(curpos, end)) {
				showthepath(S,end);
				return 1;
			}
			move(curpos, 1);
			curstep++;
		}
		else
		{
			if (!StackEmpty(S))//如果过不了
			{
				pop(S, e);
				while (e.di == 4 && !StackEmpty(S)) {//往后退到还有能走的块为止
					MarkPrint(e.seat[0], e.seat[1], maze); pop(S, e);//这个块所有的可能都尝试了,就标1和封住没区别。
				}
				if (e.di < 4)
				{
					e.di++; 	push(S, e);
					memcpy(curpos, e.seat, sizeof(e.seat));
					move(curpos, e.di);
				}
			}
		}
	} while (!StackEmpty(S));//栈不空,还有可能走的地。S
	return 0;
}

其中用到了很香的memcpy函数可以直接把数组内容拷贝过去,不用费时费力的再去循环,就非常的爽。
用法是直接memcpy(to,from,sizeof(to))。在iostream头文件中就有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值