描述

一张CT扫描的灰度图像可以用一个N*N(0 < N <= 100)的矩阵描述,矩阵上的每个点对应一个灰度值(整数),其取值范围是0-255。我们假设给定的图像中有且只有一个肿瘤。在图上监测肿瘤的方法如下:如果某个点对应的灰度值小于等于50,则这个点在肿瘤上,否则不在肿瘤上。我们把在肿瘤上的点的数目加起来,就得到了肿瘤在图上的面积。任何在肿瘤上的点,如果它是图像的边界或者它的上下左右四个相邻点中至少有一个是非肿瘤上的点,则该点称为肿瘤的边界点。肿瘤的边界点的个数称为肿瘤的周长。现在给定一个图像,要求计算其中的肿瘤的面积和周长。

输入

输入第一行包含一个正整数N(0 < N <= 100),表示图像的大小;接下来N行,每行包含图像的一行。图像的一行用N个整数表示(所有整数大于等于0,小于等于255),两个整数之间用一个空格隔开。

输出

输出只有一行,该行包含两个正整数,分别为给定图像中肿瘤的面积和周长,用一个空格分开。

样例输入

6
99 99 99 99 99 99
99 99 99 50 99 99
99 99 49 49 50 51
99 50 20 25 52 99
40 50 99 99 99 99
99 99 99 99 99 99

样例输出

9 8
#include <stdio.h>

int main() {
    int n; // 定义变量n,用于存储图像的尺寸
    int m = 0, l = 0; // 定义变量m和l,分别用于存储肿瘤区域和肿瘤周长的数量
    scanf("%d", &n); // 从输入中读取图像的尺寸
    int a[n][n]; // 定义二维数组a,用于存储图像的像素值

    // 读取输入图像的像素值
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    // 计算肿瘤区域的数量
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] <= 50) { // 如果像素值小于等于50,表示该像素属于肿瘤区域
                m++;
            }
        }
    }

    // 计算肿瘤周长的数量
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] <= 50) { // 如果像素值小于等于50,表示该像素属于肿瘤区域
                if (i - 1 < 0 || i + 1 >= n || j - 1 < 0 || j + 1 >= n || a[i - 1][j] > 50 || a[i + 1][j] > 50 || a[i][j - 1] > 50 || a[i][j + 1] > 50) {
                    l++; // 如果该像素的上下左右四个方向的像素值都大于50,表示该像素属于肿瘤周长,再看一下是否边缘.
                }
            }
        }
    }

    // 输出肿瘤区域和肿瘤周长的数量
    printf("%d %d", m, l);

    return 0;
}

更多推荐