转载请注明出处:http://blog.youkuaiyun.com/droyon/article/details/9840617
队列性质:先进先出
队列:两种操作。enqueue(入队),dequeue(出队)。
先进先出的特点,让队列具备了广度优先(搜索呈一个发射面一样散开)的特点。
如下图:红色数字组成了5x5的方阵,我们要沿着值为0的位置进行搜索,值为1的位置不可跨越。
操作:
1、将方阵加入堆栈。2、从左上角进入,检查四周可以行走的位置(值为0,可行走)3、打印行走路线图(图中标出了步数)
我们从步数可以看出,搜索呈一个发射面散开。
测试例子:
#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>
**********************************