图搜索算法

很多游戏、实际问题等的结构都和图有关,在图结构中寻找最优解也就是在图结构中进行搜索。有搜索自然就有广度优先、深度优先和启发式搜索三种方式。

图搜索算法

广度优先

顾名思义,先从广度开始:检查完一个结点的全部后继结点才会开始搜索新的结点的后继结点。在实际实施过程中,经常使用队列结构来存储访问结点(先进先出)
一般使用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;
}
上一篇:WEBAPI action返回类型


下一篇:数据结构之线性关系的C语言实现过程