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

来源:互联网 发布:电脑网络延迟高 编辑:程序博客网 时间:2024/05/01 23:52

在数字图像处理中,可以将一幅图像抽象为一个矩阵,为了方便,在这个例子中只使用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++;    }
0 0