百练2713:肿瘤面积

总时间限制: 
1000ms

内存限制: 
65536kB
描述

在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用0表示。其它肿瘤内和肿瘤外的点都用255表示。现在要求你编写一个程序,计算肿瘤内部的像素点的个数(不包括肿瘤边缘上的点)。已知肿瘤的边缘平行于图像的边缘。

输入
只有一个测试样例。第一行有一个整数n,表示正方形图像的边长。其后n行每行有n个整数,取值为0或255。整数之间用一个空格隔开。已知n不大于1000。
输出
输出一行,该行包含一个整数,为要求的肿瘤内的像素点的个数。
样例输入
5
255 255 255 255 255
255 0 0 0 255
255 0 255 0 255
255 0 0 0 255
255 255 255 255 255
样例输出
1
提示
如果使用静态数组来表示图片数据,需要将该数组定义成全局变量。
来源
    2005~2006医学部计算概论期末考试
分析
         从左至右从上到下地扫描该图片,这样可以保证找到肿瘤边界时(即值为0的坐标时),该坐标是肿瘤的左上角的点。
    从这个点出发,向右和向下扫描,统计这个肿瘤的长和宽,并将肿瘤的边界打上标记,下次再扫描到的时候直接跳过。

#include <cstdio>
#define N 1002
using namespace std;
int g[N][N];
bool mark[N][N];
struct node{
    int x,y;
};
/*
5
0 0 0 0 0
0 255 255 255 0
0 255 255 255 0
0 0 0 0 0
255 255 255 255 255
(*/
int sum;
int main(){
    int n;
    scanf("%d",&n);
    node s;
    bool first = true;
    for(int i = 0;i < n;i++)
        for(int j = 0;j < n;j++){
            scanf("%d",&g[i][j]);
        }
    sum = 0;
    for(int i = 0;i < n;i++)
    for(int j = 0;j < n;j++){
        if(mark[i][j] == 0 && g[i][j] == 0){
            int right,down;
            right = down = n - 1;
            for(int p = j;p < n;p++){
                if(g[i][p] == 0)
                    mark[i][p] = 1;
                else{
                    right = p-1;
                    break;
                }
            }
            for(int q = i;q < n;q++){
                if(g[q][j] == 0){
                    mark[q][j] = 1;
                    mark[q][right] = 1;
                }else{
                    down = q-1;
                    break;
                }
            }

            for(int p = j;p < right;p++){
                mark[down][p] = 1;
            }
            sum += (right-j-1) * (down-i-1);

        }

    }

    printf("%d",sum);

}

时间: 2024-09-29 00:14:10

百练2713:肿瘤面积的相关文章

百练_2677 肿瘤检测

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

原POJ 2713 肿瘤面积

描述 在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用0表示.其它肿瘤内和肿瘤外的点都用255表示.现在要求你编写一个程序,计算肿瘤内部的像素点的个数(不包括肿瘤边缘上的点).已知肿瘤的边缘平行于图像的边缘. 输入 只有一个测试样例.第一行有一个整数n,表示正方形图像的边长.其后n行每行有n个整数,取值为0或255.整数之间用一个空格隔开.已知n不大于1000. 输出 输出一行,该行包含一个整数,为要求的肿瘤内的像素点的个数. 样例输入 5 255 255 255

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

poj 百练 2765 八进制小数(精度问题)

2765:八进制小数 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 八进制小数可以用十进制小数精确的表示.比如,八进制里面的0.75等于十进制里面的0.963125 (7/8 + 5/64).所有小数点后位数为n的八进制小数都可以表示成小数点后位数不多于3n的十进制小数. 你的任务是写一个程序,把(0, 1)中的八进制小数转化成十进制小数. 输入 输入包括若干八进制小数,每个小数占用一行.每个小数的形式是0.d1d2d3 ... dk,这里di

ACM/ICPC 之 递归(POJ2663-完全覆盖+POJ1057(百练2775)-旧式文件结构图)

POJ2663-完全覆盖 题解见首注释 //简单递推-三个米诺牌(3*2)为一个单位打草稿得出规律 //题意-3*n块方格能被1*2的米诺牌以多少种情况完全覆盖 //Memory 132K Time: 0 Ms #include<iostream> #include<cstring> #include<cstdio> using namespace std; int ans; //开始平铺 int Tiling(int n) { int sum = 0; if (n =

百练8216-分段函数-2016正式A题

百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问 A:分段函数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 编写程序,计算下列分段函数y=f(x)的值. y=-x+2.5; 0 <= x < 5 y=2-1.5(x-3)(x-3); 5 <= x < 10 y=x/2-1.5; 10 <= x < 20 输入 一个浮点数N,0 <= N < 20 输出 输出N对应的分段函数值:f

百练 1088 滑雪

“人人为我”的解法: dp[i][j]表示坐标为(i,j)的点开始下滑的最大长度. 则dp[i][j]为(i,j)周围四个点中比(i,j)低,且最大长度最大再加一的值 用结构体来储存一个点的坐标和高度,这样按高度从小到大排完序以后还不会丢失坐标的值 从小到大遍历所有的点,经过一个点(i,j)时,用递推公式求L(i,j). 一个小技巧: 将矩阵height四周的值赋值为INF,你可以想想这是滑雪场四周非常非常高的围墙. 这样就避免了数组越界的判断,而且不会影响正确结果(因为我们找的是滑雪场内部的最

百练6255-单词反转-2016正式B题

百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问 B:单词翻转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个句子(一行),将句子中的每一个单词翻转后输出. 输入 只有一行,为一个字符串,不超过500个字符.单词之间以空格隔开. 输出 翻转每一个单词后的字符串,单词之间的空格需与原文一致. 样例输入 hello world 样例输出 olleh dlrow 1 #include <iostream> 2 #i

百练1088:滑雪 【DP】+【DFS】

总Time Limit: 1000ms Memory Limit: 65536kB Description Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区域必须向下倾斜,并且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长的滑坡.区域由一个二维数组给出.数组的每一个数字代表点的高度.以下是一个 样例 1  2  3  4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 1