华为机试——计算岛屿数量

题目

 * * 题目描述:
 * * 给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。
 * * 一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。
 * * 你可以假设网格的四个边均被水包围。
 * * 
 * * 输出描述:
 * * 岛屿的数量
 * * 
 * * 示例输入:
 * * 
 * * 5 5
 * * 1 1 1 1 0
 * * 1 1 0 1 0
 * * 1 1 0 0 0
 * * 0 0 0 0 0
 * * 
 * * 示例输出: 1

测试代码

/***********************************************************************
 * * 题目描述:
 * * 给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。
 * * 一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。
 * * 你可以假设网格的四个边均被水包围。要求可以持续的工作
 * * 
 * * 输出描述:
 * * 岛屿的数量
 * * 
 * * 示例输入:
 * * 
 * * 5 5
 * * 1 1 1 1 0
 * * 1 1 0 1 0
 * * 1 1 0 0 0
 * * 0 0 0 0 0
 * * 
 * * 示例输出: 1
 * ***********************************************************************/
#include 
#include 
#include 
#include 

#define DEBUG

/* 保存矩阵的行数和列数 */
int g_row = 0;
int g_col = 0;

/* 递归访问当前节点的上下左右 */
/* row 行标 */
/* col 列标 */
void DFS(int *src,int row,int col)
{
        *(src+row*g_col+col) = 0;                                                               /* 遍历后置零 */

        if( row-1 >= 0 && 1 == *(src+(row-1)*g_col+col) )           /* 上 */
        {
                        DFS(src,row-1,col);
                }

        if(row+1<=g_row-1&& 1 == *(src + (row+1)*g_col+col))    /* 下 */
        {
                        DFS(src,row+1,col);
                }

        if( col-1 >= 0 && 1 == *(src+row*g_col+col-1) )             /* 左 */
        {
                        DFS(src,row,col-1);
                }

        if( col+1 <= g_col-1 && 1 == *(src+row*g_col+col+1) )    /* 右 */
        {
                        DFS(src,row,col+1);
                }
}

/* 判断岛屿数量 */
int isLand(int *src)
{
        int i,j;
        if(NULL == src)
        {
                printf("[Error]:input is NULL!\n\r");
                return -1;
        }

        int count=0;

        /* 遍历矩阵 */
        for(i=0;i

测试结果

华为机试——计算岛屿数量_第1张图片

注意事项

输入数据时注意要用空格隔开,以免scanf函数不认识。

 

你可能感兴趣的:(各类面试)