第13天 对队列的总练习---迷宫(顺序队)

今天确实有点不在状态,没咋学懂

又得拖一天

明天完整写完+++链表形式求解

今天代码不做参考

#define MAXSIZE 50
#define MgWidth 8
#define MgLength 8
#define ElemType Box

#include <stdio.h>
#include<windows.h>

//假设迷宫为7*7----设1为墙;0为通道
int mg[MgWidth + 2][MgLength + 2] = { {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}
};

//方块类型
typedef struct {
	int i, j;
	int pre;//本路径上一个方块在队中的下标
}Box;
//顺序队列
typedef struct {
	Box date[MAXSIZE];
	int front, rear;
}QuType;

//顺序队-基本运算
//初始化
void InitQu(QuType*& q)
{
	q = (QuType*)malloc(sizeof(QuType));
	q->front = q->rear=-1;
}
//销毁
void  DestroyQu(QuType*& q)
{
	free(q);
}
//判空
bool QuEmpty(QuType* q)
{
	return (q->rear==NULL);
}
//进队
bool enQu(QuType* q,ElemType e)
{
	if (q->rear=MAXSIZE-1)
	{
		return false;
	}
	//QuType* r;
	//r = (QuType*)malloc(sizeof(QuType));
	q->rear++;
	q->date[q->rear] = e;
	return true;
}
//出队
bool DeQu(QuType*& q, ElemType& e)
{
	if (q->rear == q->front)
	{
		return false;
	}
	q->front++;
	e=q->date[q->front];
	return true;
}
//判空
bool QueueEmpty(QuType* q)
{
	return(q->rear == q->front);
}
//队长
bool QuLen(QuType* q)
{
	int i = 0;
	while (q->front != q->rear) {
		i++;
		q->front++;
	}
	return true;
}
//----------------------------------------------------------------
//输出路径坐标   参数:队列q ,front
void print(QuType* q, int front)
{
	int k = front, j, ns = 0;
	printf("\n");
	do
	{
		j = k;
		k = q->date[k].pre;
		q->date[j].pre = -1;
	} while (k != 0);
	printf("一条迷宫路径如下:\n");
	k = 0;
	while (k < MAXSIZE)
	{
		if (q->date[k].pre == -1)
		{
			ns++;
			printf("\t(%d,%d)", q->date[k].i, q->date[k].j);
			if (ns % 5 == 0)
			{
				printf("\n");
			}
			k++;
		}
		printf("\n");
	}
}
//参数:起点坐标、终点坐标
bool mgpath(int xi, int yi, int xe, int ye)
{
	Box e;
	QuType* q;
	int i, j, k,di;
	int i1,j1;
	InitQu(q);
	bool find;
	e.i = xi;    //起点进队 
	e.j = yi;   
	e.pre = -1;
	enQu(q, e);
	mg[xi][yi] = -1;	//将起点位置重新赋值,避免重复判断

	while (q->rear != NULL)
	{
		DeQu(q, e);
		i = e.i; j = e.j; di = e.pre;
		if (i == xe && j == ye)			//找到一条路径
		{
			printf("找到路径\n");
			print(q, q->front);
			DestroyQu(q);
			return true;
			
		}
		//find = false;
		for (di = 0; di < 4; di++)		//寻找方块e下一个可以走的所有邻块
		{
			switch (di)		
			{
				case 0:		
				{
					i1 = i-1; j1 = j ; break;
				}
				case 1:
				{
					i1 = i; j1 = j + 1; break;
				}
				case 2:
				{
					i1 = i + 1; j1 = j; break;
				}
				case 3:
				{
					i1 = i; j1 = j - 1; break;
				}
			}

			if (mg[i1][j1] == 0)
			{
				e.i = i1; e.j = j1; 
				e.pre = q->front;
				enQu(q, e);
				mg[i1][j1] = -1;
			}
		}

	}
	DestroyQu(q);
	return false;

}


int main()	
{
	if (!mgpath(1,1,8,8))
	{
		printf("无解");
		return 1;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值