【编程题】挺有意思的一道题,老铁们还有更好的思路吗?
卫星拍摄的地面遥感图像是一个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; }