【编程题】挺有意思的一道题,老铁们还有更好的思路吗?

卫星拍摄的地面遥感图像是一个NxN的网络,每个网格或者是树木(用T表示)或者是空地(用B表示),如果树木网格的邻居(或上或下或左或右)网格也是树木,则它们属于同一片森林。试设计算法,统计遥感图像区域的森林数量。

例:下图中的森林数量为3。

int count(char **map, int N) //map是遥感图像,N是图像大小。

以下是我的思路:
#include <stdio.h>

int count(char **map, int n) //map是遥感图像,n是图像大小
{
    int count = 0;
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<n;j++)
        {
            char *c = (char *)map + i * n + j; //当前字符地址
            char *c_up = i >0 ? (char *)map + (i-1) * n + j : c; //上
            char *c_right = j < (n-1) ? (char *)map + i * n + j + 1 : c;//右
            char *c_down = i < (n-1) ? (char *)map + (i+1) * n + j : c;//下
            char *c_left = j>0 ? (char *)map + i * n + j : c;//左

            if(*c == 'T' || *c == 'Y')
            {
                if(*c == 'T' && *c_up!='Y' && *c_right!='Y' && *c_down!='Y' && *c_left!='Y')
                {
                    count++;
                    *c = 'Y';
                }

                //成片标记
                if(*c_up == 'T') *c_up = 'Y';
                if(*c_right == 'T') *c_right = 'Y';
                if(*c_down == 'T') *c_down = 'Y';
                if(*c_left == 'T') *c_left = 'Y';
            }
        }
    }

    return count;
}

int main() {

    //3个森林
    char map1[4][4] = {{'T','T','B','B'}, {'T','B','T','B'}, {'T','T','B','T'}, {'B','B','T','T'}};
    printf("%d\n", count((char **)map1, 4));

    //8个森林
    char map2[6][6] = {{'T','T','B','T','B','T'}, {'B','B','T','T','T','B'}, {'B','T','B','B','B','T'}, {'T','B','B','B','B','B'},{'T','T','B','T','B','T'},{'T','T','B','T','B','T'}};
    printf("%d\n", count((char **)map2, 6));

    return 0;
}


全部评论

相关推荐

点赞 评论 收藏
分享
白火同学:大二有这水平很牛了,可以适当对关键信息加粗一点,比如关键技术、性能指标之类的。
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务