算法思想
广度优先搜索算法的基本思想是:从初始状态S开始,利用规则,生成下一步可能的状态。构成树的下一层节点,检查是否出现出口G,若未出现,就对该层所有状态节点,分别顺序利用规则。生成再下一层的所有状态节点,直到出现目标状态为止。
程序实现
- 定义结构体和相关数组
int head, rear, size = 0, num = 0;typedef struct node {int x, y;struct node *next;} node_t;node_t b[N], way[N]; //队列b,和记录路径坐标的结构体数组int a[N][N]; //构造地图
- 打印最短路径
void print_path() {int i;for(i = num - 1 ; i >= 0 ; i--) {printf("(%d, %d)\n", way[i].x, way[i].y);}}
- 将整个地图周围用1围起来,方便搜索
void surround() {int i , j ;for(i = 0 ; i< size + 2 ; i++) {for(j = 0 ; j < size + 2 ; j++) {if(i == 0 || i == size + 1 || j == 0 || j == size + 1) {a[i][j] = 1;}}}}
- 初始化队列
void init() {head = 0;rear = 0;}
- 弹出队列成员
node_t *pop() {node_t *p;p = &b[head];head++;return p;}
- 将走过的点信息加入队列,next为指向上一个节点数据的指针
void record(int x ,int y ,node_t * next) {b[rear].x = x;b[rear].y = y;b[rear].next =next;rear++;}
- 遍历地图,查找路径
void travel() {node_t *temp;record(1, 1, NULL);while(1) {if(head >= rear) return;//当队头和队尾相等时,退出temp = pop();//当走到终点时,用way数组又保存返回到起点的路径if(temp -> x == size && temp->y == size) {//将第一个数据的next指针指向空,作为返回起点的终止条件。while(temp != NULL) {way[num].x = temp->x - 1;way[num].y = temp->y - 1;num++;temp = temp->next;}return;}//遍历四个方向,只要满足条件,就加入队列if(a[temp->x][temp->y - 1] != 1) {record(temp->x, temp->y - 1, temp);a[temp->x][temp->y - 1] = 1;}if(a[temp->x][temp->y + 1] != 1) {record(temp->x ,temp->y + 1 ,temp);a[temp->x][temp->y + 1] = 1;}if(a[temp->x - 1][temp->y] != 1) {record(temp->x - 1 ,temp->y, temp);a[temp->x - 1][temp->y] = 1;}if(a[temp->x + 1][temp->y] != 1) {record(temp->x + 1, temp->y, temp);a[temp->x + 1][temp->y] = 1;}}}
- 主函数
int main() {printf("请输入一个N*N的迷宫大小N:");scanf("%d", &size);memset(a, 0, sizeof(a));int i, j;printf("请输入迷宫内部构造(0表示通路,1表示墙壁):\n");for(i = 1 ; i < size + 1 ; i ++) {for(j = 1 ; j < size + 1; j++) {if(scanf("%d", &a[i][j]) == EOF) {return 0;}}}surround();init();travel();print_path();return 0;}
运行结果

