冒险岛问题:划分岛屿与陆地(矩阵求四邻域个数问题)

来源:互联网 发布:淘宝无线端图片模糊 编辑:程序博客网 时间:2024/04/30 19:23

冒险岛问题:划分岛屿与陆地

我们可以用一个二维数组来描述冒险岛的地图,0表示水域,1表示陆地。四邻域相近为连通(不包括对角),统计冒险岛上有几个岛屿?

输入: 4 5

11110

11010

11001

11101

输出:2

#include "stdafx.h"#include <vector>using namespace std;//递归调用,遍历某个岛屿的所有像素点void arrSearch(int i,int j,vector<vector<short>> *arr,int num,int nrow,int ncol){     // 从上下左右四个方向查询邻近像素点是否为陆地      if ((i > 0)){        if ((*arr)[i - 1][j] == 1){        (*arr)[i - 1][j] = num;        arrSearch(i - 1, j, arr, num, nrow, ncol);    }    }    if ((i<nrow-1)){        if ((*arr)[i + 1][j] == 1)    {        (*arr)[i + 1][j] = num;        arrSearch(i + 1, j, arr, num, nrow, ncol);        }    }    if ((j<ncol-1)){        if ((*arr)[i][j + 1] == 1){            (*arr)[i][j + 1] = num;            arrSearch(i, j + 1, arr, num, nrow, ncol);        }    }    if (j>0){        if (((*arr)[i][j - 1] == 1)){            (*arr)[i][j - 1] = num;            arrSearch(i, j - 1, arr, num, nrow, ncol);        }    }}void  testarr(short arr[][10]){ //测试二维数组传递地址的形式,该形式合法}int _tmain(int argc, _TCHAR* argv[]){    int m = 6;//矩阵的行    int n = 6;//矩阵的列    int num = 1;//岛的标注数    vector<vector<short>> arr2;//vector方式存储矩阵    vector<short> arr3;         //初始化vector    for (int i = 0; i < n; i++){            arr3.push_back(0);    }    for (int j = 0; j < m; j++){        arr2.push_back(arr3);    }//冒险岛矩阵赋初值    short arr9[10][10] = {        { 1, 1, 0, 1, 0 },        { 1, 0, 1, 0, 0 },        { 0, 1, 0, 1, 0 },        { 1, 1, 0, 1, 0 },        { 1, 0, 1, 1, 0 }    };//    testarr(arr9); //测试二维数组传递地址的形式         //vector向量矩阵赋值     for (int i = 0; i < n; i++){        for (int j = 0; j < m; j++){            arr2[j][i] = arr9[j][i];        }    }//遍历每一个像素点,若是没处理过的陆地则进行递归寻找相邻像素点    for (int i = 0; i < m; i++){        for (int j = 0; j < n; j++){                if (arr2[i][j]==1){                /*                //测试上方的点是否已处理                if ((i > 0)){                    if(arr2[i - 1][j]> 1){                        arr2[i][j] = arr2[i - 1][j];                    }                }                //测试左边的点是否已处理                if (j > 0){                    if (arr2[i][j - 1] > 1){arr2[i][j] = arr2[i][j - 1];}                }                //陆地没处理则标注为新的岛屿                if (arr2[i][j] == 1){                    num++;                    arr2[i][j] = num;                }                */                 //递归调用寻找附近陆地                     num++;                    arr2[i][j] = num;                arrSearch(i, j, &arr2, arr2[i][j], m, n);            }                }        }        //输出岛屿数    printf("number:%d", num - 1);    getchar();    return 0;}

可执行代码下载(VS2013控制台程序)

http://download.csdn.net/download/liangyanghui/9973141


原创粉丝点击