广度优先搜索应用一:着色法

在数字图像处理中,可以将一幅图像抽象为一个矩阵,为了方便,在这个例子中只使用0~9这几个数字,进一步抽象,可以把这些数字表示为地图上的海拔高度,0表示海平面,1~9都表示陆地,数字的大小表示海拔的高低。假设初始点在(6,4)处,现在需要计算出该点周围有多少个非0的格子,即该岛的面积。这里把初始点相邻的陆地是为一个岛。
其实就是从(6,4)开始广度优先搜索。每次需要向上下左右四个方向扩展,当扩展出的点大于0时就加入队列,直到队列扩展完毕,所有被加入队列的点的小岛数就是岛的面积。假设图的大小不超过100*100。

int n = 100, m = 100;//假设地图大小不超过100*100
    int p = 89, q = 64;//终点
    struct note que[10001];//大小根据需要定义,这里我们假设地图大小不超过100*100
    int head, tail;
    int maze[100][100] = { 0 };//存储地图
    int mark[100][100] = { 0 };//记录哪些点已经在队列中了,防止一个点被重复扩展

    //定义一个用于表示走的方向的数组
    int next[4][2] = {
        { 0, 1 },//向右走
        { 1, 0 },//向下走
        { 0, -1 },//向左走
        { -1, 0 },//向上走
    };
    int k, flag,tx,ty;
    int sum = 1;//记录岛屿的大小,初始为1

    //队列初始化
    head = 1;
    tail = 1;
    //第一步是把(1,1)加入队列,并标记(1,1)已经走过
    que[tail].x = 1; que[tail].y = 1; que[tail].s = 0;
    ++tail;
    mark[1][1] = 1;

    flag = 0;//用来标记是否到达目标点,0表示暂时还没到达,1表示到达
    while (head < tail){
        //枚举四个方向
        for (k = 0; k < 3; ++k){
            //计算下一个点的坐标
            tx = que[head].x + next[k][0];
            ty = que[head].y + next[k][1];
            //判断是否越界
            if (tx<1 || tx>n || ty<1 || ty>m)
                continue;
            //判断是否是障碍物或者已经在路径中
            if (maze[tx][ty] >0 && mark[tx][ty] == 0){
                //把这个点标记为已经走过
                mark[tx][ty] = 1;
                //把走过的点算如岛屿的面积
                ++sum;
                que[tail].x = tx;
                que[tail].y = ty;
                que[tail].s = que[head].s + 1;//步数是前面一步的步数加1
                ++tail;
            }
            //如果到了目标点,停止扩展,任务结束,退出循环
            if (tx == p&&ty == q){
                flag = 1;
                break;
            }
        }
        if (flag == 1)
            break;
        head++;
    }

你可能感兴趣的:(广度优先搜索,bfs)