#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.
}
#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.
}