关闭

数据结构之广度优先搜索(队列实现)问题

标签: 数据结构广度优先搜索队列实现
376人阅读 评论(0) 收藏 举报
分类:

Description

定义一个二维数组: 
int maze[5][5] = {

	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,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示

数组
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

结果

(4,4)
(3,4)
(2,4)
(2,3)
(2,2)
(2,1)
(2,0)
(1,0)
(0,0)


思路:基本思想是这样的:通过一个可行的点A,向其周围探索,得到其他可行的点B(i),并加入队列,B(i)的前驱便是A。这样循环下去,直到找到终点。

代码:



#include<stdio.h>

#define MAX_ROW 5
#define MAX_COL 5

int head = 0, tail = 0;

struct Node {
    int row;
    int col;
    int before;
} 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 push_queue(struct Node node)
{   /*这个地方不是head++*/
    queue[tail++] = node;
}

struct Node pop_queue()
{   /*注意这个地方不是tail++**/
    return queue[head++];
}

int is_empty()
{
    return tail == head;
}

void visit(int row, int col)
{
    struct Node p = { row, col, head - 1 };
    /*给访问过的点赋值为3 */
    /*注意这个地方不是用 p = {3}; */
    maze[row][col] = 3;
    push_queue(p);
}

void printf_queue()
{
    for (int i = 0; i < MAX_ROW; i++)
    {
	for (int j = 0; j < MAX_COL; j++)
	{
	    printf("%d\t", maze[i][j]);
	}
	printf("\n");
    }
    printf("***********\n");
}

int main()
{
    struct Node p = {0, 0, -1};
    maze[p.row][p.col] = 3;
    push_queue(p); 
    printf("is empty %d\n", is_empty());
    while (!is_empty())
    {
	p = pop_queue();
	if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1)
	{
	    break;
	}
	if (p.col + 1 < MAX_COL && maze[p.row][p.col + 1] == 0)
	{
	    visit(p.row, p.col + 1);  /**右边**/
	}
	if (p.row + 1 < MAX_ROW && maze[p.row + 1][p.col] == 0)
	{
	    visit(p.row + 1, p.col); /**下边**/
	}
	if (p.col - 1 >= 0 && maze[p.row][p.col - 1] == 0)
	{
	    visit(p.row, p.col - 1); /**左边**/
	}
	if (p.row - 1 >= 0 && maze[p.row - 1][p.col])
	{
	    visit(p.row - 1, p.col); /**上边**/
	}
	printf_queue();

    }
    if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1)
    {
        /*记得这里也要打印一行不然后面结果会少一行*/
        printf("(%d,%d)\n", p.row, p.col);
 	while (p.before != -1)
	{
	    p = queue[p.before];
	    printf("(%d,%d)\n", p.row, p.col);
	}
    }
    else
    {
	printf("no this path");
    }

    return 0;
}


结果展示:

is empty 0
3	1	0	0	0	
3	1	0	1	0	
0	0	0	0	0	
0	1	1	1	0	
0	0	0	1	0	
***********
3	1	0	0	0	
3	1	0	1	0	
3	0	0	0	0	
0	1	1	1	0	
0	0	0	1	0	
***********
3	1	0	0	0	
3	1	0	1	0	
3	3	0	0	0	
3	1	1	1	0	
0	0	0	1	0	
***********
3	1	0	0	0	
3	1	0	1	0	
3	3	0	0	0	
3	1	1	1	0	
0	0	0	1	0	
***********
3	1	0	0	0	
3	3	0	1	0	
3	3	3	0	0	
3	1	1	1	0	
0	0	0	1	0	
***********
3	1	0	0	0	
3	3	0	1	0	
3	3	3	0	0	
3	1	1	1	0	
3	0	0	1	0	
***********
3	1	0	0	0	
3	3	0	1	0	
3	3	3	0	0	
3	1	1	1	0	
3	0	0	1	0	
***********
3	1	0	0	0	
3	3	0	1	0	
3	3	3	3	0	
3	1	1	1	0	
3	0	0	1	0	
***********
3	3	0	0	0	
3	3	3	1	0	
3	3	3	3	0	
3	1	1	1	0	
3	0	0	1	0	
***********
3	3	0	0	0	
3	3	3	1	0	
3	3	3	3	0	
3	1	1	1	0	
3	3	0	1	0	
***********
3	3	0	0	0	
3	3	3	1	0	
3	3	3	3	0	
3	1	1	1	0	
3	3	0	1	0	
***********
3	3	0	0	0	
3	3	3	1	0	
3	3	3	3	0	
3	1	1	1	0	
3	3	0	1	0	
***********
3	3	0	0	0	
3	3	3	3	0	
3	3	3	3	3	
3	1	1	1	0	
3	3	0	1	0	
***********
3	3	0	0	0	
3	3	3	3	0	
3	3	3	3	3	
3	1	1	1	0	
3	3	0	1	0	
***********
3	3	3	0	0	
3	3	3	3	0	
3	3	3	3	3	
3	1	1	1	0	
3	3	0	1	0	
***********
3	3	3	0	0	
3	3	3	3	0	
3	3	3	3	3	
3	3	1	1	0	
3	3	3	1	0	
***********
3	3	3	0	0	
3	3	3	3	0	
3	3	3	3	3	
3	3	1	1	0	
3	3	3	1	0	
***********
3	3	3	0	0	
3	3	3	3	0	
3	3	3	3	3	
3	3	1	1	0	
3	3	3	1	0	
***********
3	3	3	0	0	
3	3	3	3	0	
3	3	3	3	3	
3	3	1	1	3	
3	3	3	1	0	
***********
3	3	3	0	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	1	1	3	
3	3	3	1	0	
***********
3	3	3	3	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	1	1	3	
3	3	3	1	0	
***********
3	3	3	3	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	0	
***********
3	3	3	3	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	0	
***********
3	3	3	3	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	0	
***********
3	3	3	3	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	0	
***********
3	3	3	3	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	3	
***********
3	3	3	3	0	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	3	
***********
3	3	3	3	3	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	3	
***********
3	3	3	3	3	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	3	
***********
3	3	3	3	3	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	3	
***********
3	3	3	3	3	
3	3	3	3	3	
3	3	3	3	3	
3	3	3	1	3	
3	3	3	1	3	
***********
(4,4)
(3,4)
(2,4)
(2,3)
(2,2)
(2,1)
(2,0)
(1,0)
(0,0)








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:793611次
    • 积分:14598
    • 等级:
    • 排名:第864名
    • 原创:637篇
    • 转载:316篇
    • 译文:11篇
    • 评论:414条
    联系方式

    我的github




    QQ:2657607916

    QQ讨论群:346618607

    微信:chenyu_920310

    邮箱:2657607916@qq.com