转载请注明出处:http://blog.csdn.net/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> **********************************