首页 > 技术交流 > 【编程题】挺有意思的一道题,老铁们还有更好的思路吗?

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

头像
胖虎不吃小孩
编辑于 2021-01-18 10:31:40 APP内打开
赞 0 | 收藏 3 | 回复3 | 浏览2111
卫星拍摄的地面遥感图像是一个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;
}


3条回帖

回帖
加载中...
话题 回帖

相关热帖

技术交流近期热帖

近期精华帖

热门推荐