C基础:队列性质应用广度搜索

转载请注明出处:http://blog.csdn.net/droyon/article/details/9840617

队列性质:先进先出

队列:两种操作。enqueue(入队),dequeue(出队)。

先进先出的特点,让队列具备了广度优先(搜索呈一个发射面一样散开)的特点。

如下图:红色数字组成了5x5的方阵,我们要沿着值为0的位置进行搜索,值为1的位置不可跨越。

操作:

1、将方阵加入堆栈。2、从左上角进入,检查四周可以行走的位置(值为0,可行走)3、打印行走路线图(图中标出了步数)

C基础:队列性质应用广度搜索_第1张图片

我们从步数可以看出,搜索呈一个发射面散开。

测试例子:

#include<stdio.h>

#define MAX_ROW 5
#define MAX_COL 5

int curIndex = 0;

struct point {
	int x, y;
}queue[512];

int maze[MAX_ROW][MAX_COL] = {
	{0, 1, 0, 0, 0},
	{0, 1, 0, 1, 0},
	{0, 0, 0, 0, 0},
	{0, 1, 1, 1, 0},
	{0, 0, 0, 1, 0},
};

void print_maze()
{
	int i = 0, j = 0;
	printf("第%d次操作结果**************************\n",
	       ++curIndex);
	for (i = 0; i < MAX_ROW; i++) {
		for (j = 0; j < MAX_COL; j++) {
			if (maze[i][j] == 0) {
				printf("%c\t", '#');
			} else if (maze[i][j] == 2) {
				printf("%s\t", "<0>");
			} else {
				printf("%c\t", '|');
			}
		}
		printf("\n");
	}
	printf("**********************************\n");
}

int head=0,tail=0;

void enqueue(struct point p){
    queue[tail] = p;
    tail++;
}

struct point dequeue(void){
    head++;
    return queue[head-1];
}

int isEmpty(void){
    return head == tail;
}

void visit(int row,int col){
    maze[row][col] = 2;
    struct point visit_point = {row,col};
    enqueue(visit_point);
    print_maze();
}

int main(void){
	struct point p = { 0, 0 };
	maze[0][0] = 2;
	enqueue(p);
	while (!isEmpty()) {
		p = dequeue();
		if (p.x == MAX_ROW - 1 && p.y == MAX_COL - 1) {
    		continue;
		}
		if (p.x + 1 < MAX_ROW && maze[p.x + 1][p.y] == 0) {
			visit(p.x + 1, p.y);
		}
		if (p.x - 1 > -1 && maze[p.x - 1][p.y] == 0) {
			visit(p.x - 1, p.y);
		}
		if (p.y + 1 < MAX_COL && maze[p.x][p.y + 1] == 0) {
			visit(p.x, p.y + 1);
		}
		if (p.y - 1 > -1 && maze[p.x][p.y - 1] == 0) {
			visit(p.x, p.y - 1);
		}
	}
	return 0;
}
打印:

第1次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
#	#	#	#	#	
#	|	|	|	#	
#	#	#	|	#	
**********************************
第2次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	#	#	#	#	
#	|	|	|	#	
#	#	#	|	#	
**********************************
第3次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	#	#	#	#	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第4次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	<0>	#	#	#	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第5次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	<0>	#	#	#	
<0>	|	|	|	#	
<0>	#	#	|	#	
**********************************
第6次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	<0>	<0>	#	#	
<0>	|	|	|	#	
<0>	#	#	|	#	
**********************************
第7次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	<0>	<0>	#	#	
<0>	|	|	|	#	
<0>	<0>	#	|	#	
**********************************
第8次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	#	#	
<0>	|	|	|	#	
<0>	<0>	#	|	#	
**********************************
第9次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	#	
<0>	|	|	|	#	
<0>	<0>	#	|	#	
**********************************
第10次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	#	
<0>	|	|	|	#	
<0>	<0>	<0>	|	#	
**********************************
第11次操作结果**************************
<0>	|	<0>	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	#	
<0>	|	|	|	#	
<0>	<0>	<0>	|	#	
**********************************
第12次操作结果**************************
<0>	|	<0>	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	#	
<0>	<0>	<0>	|	#	
**********************************
第13次操作结果**************************
<0>	|	<0>	<0>	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	#	
<0>	<0>	<0>	|	#	
**********************************
第14次操作结果**************************
<0>	|	<0>	<0>	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
<0>	<0>	<0>	|	#	
**********************************
第15次操作结果**************************
<0>	|	<0>	<0>	#	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
<0>	<0>	<0>	|	#	
**********************************
第16次操作结果**************************
<0>	|	<0>	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
<0>	<0>	<0>	|	#	
**********************************
第17次操作结果**************************
<0>	|	<0>	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
<0>	<0>	<0>	|	<0>	
**********************************

你可能感兴趣的:(c,Queue,广度搜索,队列应用)