冒险岛问题:划分岛屿与陆地
我们可以用一个二维数组来描述冒险岛的地图,0表示水域,1表示陆地。四邻域相近为连通(不包括对角),统计冒险岛上有几个岛屿?
输入: 4 5
11110
11010
11001
11101
输出:2
#include "stdafx.h"
#include
using namespace std;
//递归调用,遍历某个岛屿的所有像素点
void arrSearch(int i,int j,vector> *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 ((i0){
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> arr2;//vector方式存储矩阵
vector 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