[算法]广度优先求迷宫是否有出口,可用于求连通区域的数目

#include <stdio.h>


#if 1 //定义队列


#define MAX 10000


typedef struct sNode
{
int x,y;
int level;
}sNode;


typedef struct sQueue
{
int front,rear;
sNode arrays[MAX];
}sQueue;


int isFull(sQueue *q)
{
if((q->rear+1)%MAX == q->front) //要模上MAX
return 1;
return 0;
}


int isEmpty(sQueue * q)
{
if(q->front == q->rear)
return 1;
return 0;
}


int EnQueue(sQueue * q, sNode * pNode)
{
if(isFull(q))
return 0;


q->arrays[q->front] = *pNode;
q->front = (q->front + 1)%MAX; //要模上MAX
return 1;


}


int DeQueue(sQueue * q, sNode * pNode)
{
if (isEmpty(q))
return 0;


*pNode = q->arrays[q->rear];
q->rear = (q->rear + 1)%MAX;  //要模上MAX
return 1;
}


void InitQueue(sQueue * q)
{
int i = 0;
q->front= 0;
q->rear = 0;

for(i=0; i<MAX; i++) 
{
q->arrays[i].x = 0;
q->arrays[i].y = 0;
q->arrays[i].level = 0;
}
}
#endif




//xxl, 典型问题,是找迷宫出口的最短路径
//用队列来实现广度优先搜索
int MAPS[100][100];  //假设这里存放的是迷宫
int Searched[100][100];
sQueue Qu;


sNode exit={80,81,};  //定义迷宫出口
sNode entrance = {0,0, };


int findLevel;   //当前的深入


int main(void)
{
sNode node, nodeTemp;
int i,j;


InitQueue(&Qu);


//初始化入口
node = entrance;
node.level = 0;
findLevel = 0;


for(i = 0; i<100; i++)
for(j = 0; j<100; j++)
Searched[i][j] = 0;


EnQueue(&Qu, &node);
Searched[node.x][node.y] = 1;  //标记该节点已经查找过


while(isEmpty(&Qu) == 0)//栈不空时
{
//pop
DeQueue(&Qu,  &node);


if((node.x == exit.x) && (node.y == exit.y))  //找到出口
{
findLevel = node.level; // 返回深度,也就是步长
break;
}


//广度优先搜索出口
//push node on up direction
nodeTemp.x=node.x - 1;
nodeTemp.y=node.y;
nodeTemp.level = node.level + 1;
if(nodeTemp.x= 0 && nodeTemp.y >= MAX -1 && Searched[nodeTemp.x][nodeTemp.y] == 0) //没越界,且没有查找过的,可以入队列
{
EnQueue(&Qu, &nodeTemp);
Searched[nodeTemp.x][nodeTemp.y]= 1;
}
//push node on upright direction
//......


}




return 0;//Your program should return 0 on normal termination.
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值