[算法]廣度優先求迷宮是否有出口,可用於求連通區域的數目

#include


#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.
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章