很多游戏、实际问题等的结构都和图有关,在图结构中寻找最优解也就是在图结构中进行搜索。有搜索自然就有广度优先、深度优先和启发式搜索三种方式。
广度优先
顾名思义,先从广度开始:检查完一个结点的全部后继结点才会开始搜索新的结点的后继结点。在实际实施过程中,经常使用队列结构来存储访问结点(先进先出)
一般使用CLOSED表存储已经访问过的结点,使用OPEN表存储待访问的结点列表。以下是C语言队列实现方式,基本操作包括初始化、入队、出队、判空等。
#define MAX_QUEUE_SIZE 1000
#define OK 1
#define ERROR 0
typedef int Status;
struct Queue{
ElemType Elem[MAX_STACK_SIZE];
int front;
int rear;
int length;
};
Status InitQueue(struct Queue &Q)
{
Q.front=0;
Q.rear=0;
Q.length=0;
return OK;
}
bool QueueEmpty(struct Queue Q)
{
return (Q.length==0);
}
Status EnQueue(struct Queue &Q, ElemType e)
{
if(Q.length>=MAX_QUEUE_SIZE)
return ERROR;
Q.Elem[Q.rear]=e;
Q.rear=(Q.rear+1)%MAX_QUEUE_SIZE;
Q.length++;
return OK;
}
Status DeQueue(struct Queue &Q, ElemType &e)
{
if(Q.length==0)
return ERROR;
e=Q.Elem[Q.front];
Q.front=(Q.front+1)%MAX_QUEUE_SIZE;
Q.length--;
return OK;
}
深度优先
顾名思义,访问完一个结点的全部后继(一路走到底)然后再开始走新路。同样需要两个表来记录待访问结点和已访问结点,此时使用的是栈结构先进后出。
以下是C语言栈结构实现方式,包括初始化、判空、入栈、出栈等。
struct Stack{
ElemType Elem[MAX_STACK_SIZE];
int top;
};
Status InitStack(struct Stack &S)
{
S.top=0;
return OK;
}
bool StackEmpty(struct Stack S)
{
if(S.top==0)
return true;
else
return false;
}
Status Push(struct Stack &S, ElemType e)
{
if(S.top>=MAX_STACK_SIZE)
return ERROR;
S.Elem[S.top]=e;
S.top++;
return OK;
}
Status Pop(struct Stack &S, ElemType &e)
{
if(S.top==0)
return ERROR;
e=S.Elem[S.top-1];
S.top--;
return OK;
}