统计灰度不超过 50 的肿瘤格,并以边界或四邻非肿瘤条件判断周长。
OJ: noi_openjudge
题目 ID: ch0108-19
难度:普及-
标签:矩阵模拟python
日期: 2026-07-30 23:01
题意
灰度不超过
思路
扫描每个肿瘤格累加面积。它位于图像边缘,或任一上下左右合法邻居不是肿瘤时,便是边界格,累加周长。
代码
cpp
#include <cstdio>
int n,m;
int a[200][200];
int cnt=0;
int fx[4][2] = { 0,-1, -1,0, 1,0, 0,1 };
void init(){
scanf("%d",&n);
int i,j;
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
}
bool is_cancer(int x,int y){
if( a[x][y] <=50)
return 1;
return 0;
}
bool in_map(int x,int y){
if( x >=1 && x <= n && y >=1 && y <=n)
return 1;
return 0;
}
bool is_cancer_bound(int x,int y){
if( is_cancer(x,y)){
int i;
for (i=0;i<4;i++){
int nx = x + fx[i][0];
int ny = y + fx[i][1];
if( !is_cancer(nx,ny) || !in_map(nx, ny))
return 1;
}
return 0;
}
return 0;
}
int main(){
init();
int i,j;
int cnt_1 = 0;
int cnt_2 = 0;
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
if( is_cancer(i, j))
cnt_1++;
if( is_cancer_bound(i, j))
cnt_2++;
}
}
printf("%d %d",cnt_1,cnt_2);
return 0;
}复杂度
总结
Python代码
python
size = int(input())
image = [list(map(int, input().split())) for _ in range(size)]
area = 0
perimeter = 0
for row in range(size):
for column in range(size):
if image[row][column] > 50:
continue
area += 1
if row in (0, size - 1) or column in (0, size - 1) or any(image[row + dx][column + dy] > 50 for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)) if 0 <= row + dx < size and 0 <= column + dy < size):
perimeter += 1
print(area, perimeter)C++代码
cpp
#include <cstdio>
int n,m;
int a[200][200];
int cnt=0;
int fx[4][2] = { 0,-1, -1,0, 1,0, 0,1 };
void init(){
scanf("%d",&n);
int i,j;
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
}
bool is_cancer(int x,int y){
if( a[x][y] <=50)
return 1;
return 0;
}
bool in_map(int x,int y){
if( x >=1 && x <= n && y >=1 && y <=n)
return 1;
return 0;
}
bool is_cancer_bound(int x,int y){
if( is_cancer(x,y)){
int i;
for (i=0;i<4;i++){
int nx = x + fx[i][0];
int ny = y + fx[i][1];
if( !is_cancer(nx,ny) || !in_map(nx, ny))
return 1;
}
return 0;
}
return 0;
}
int main(){
init();
int i,j;
int cnt_1 = 0;
int cnt_2 = 0;
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
if( is_cancer(i, j))
cnt_1++;
if( is_cancer_bound(i, j))
cnt_2++;
}
}
printf("%d %d",cnt_1,cnt_2);
return 0;
}复杂度
每格检查固定四邻居,时间复杂度为
总结
区域边界判定的核心是检查相邻位置是否离开该区域或图像。