C语言题目——肿瘤面积,求解!我下面将给出在C++6.0环境下的代码,请高手告诉我简单C的写法!

肿瘤面积
描述
在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用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程序#include<iostream>
using namespace std;
int main()
{
int i,j;
int X,Y;
int n;
int X_Num=0,Y_Num=0;
int Array[100][100];
int result;
cin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ cin>>Array[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ if(Array[i][j]==0)
{ X=i;Y=j; i=n;//找到第一个为0的位置后,退出双重循环 break;
}//
}
} //cout<<"X="<<X<<" Y="<<Y<<endl;
for(i=X;i<n;i++)
{
if(Array[i][Y]==0)
{ X_Num++;
}
else
break;
}
for(j=Y;j<n;j++)
{
if(Array[X][j]==0)
Y_Num++;
else
break;
} //cout<<"X_Num="<<X_Num<<" Y_Num="<<Y_Num<<endl; result=X_Num*Y_Num-2*X_Num-2*Y_Num+4;
cout<<result;
}

思路1:根据问题描述,结果存在于一个平行于输入矩阵的边缘的矩形内,即只有一个左上角的起始坐标最小和右下角的结束坐标最大,所以在输入数据的时候就可以同时判断并得到该两点的坐标(位于肿瘤边界上)再直接计算该边界所涵盖面积就可以了。
思路1 程序:
#define N 100
int main(int argc, char *argv[])
{
int kk = 0;
int sizep, i, j;
int PosX_str = N, PosY_str = N, PosX_end = 0, PosY_end = 0;
//矩形左上起始点(start)和右下结束点(end)坐标
int Dat[100][100];
scanf("%d", &sizep);
for(i = 0; i < sizep; ++i)
{
for(j = 0; j < sizep; ++j)
{
scanf("%d", &Dat[i][j]);
if(0 == Dat[i][j]) //是矩形边界点
{
if((i < PosX_str) || (j < PosY_str)) //该点坐标是否比起始点“小”?
{
PosX_str = i;
PosY_str = j;
}
if((i > PosX_end) || (j > PosY_end)) //该点坐标是否比结束点“大”?
{
PosX_end = i;
PosY_end = j;
}
}
}
}
//printf("X_str = %d Y_str = %d\n", PosX_str, PosY_str);
//printf("X_end = %d Y_end = %d\n", PosX_end, PosY_end);
printf("NUM = %d\n", (PosX_end - PosX_str -1) * (PosY_end - PosY_str -1));
system("PAUSE");
return 0;
}
思路2:
直接在输入的时候判断肿瘤矩形内部的255的个数。
程序描述:如果当前输入的是255,则判断标志位(标志位表示当前输入是否处于肿瘤矩形内部),如果标志位合法就进行累加,否则置标志位非法。
这样直接对每一个输入数据判断,数据输入完成的时候,问题同时也解决;
具体程序就不给了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-13
思路:由0构成边界,求出右下角的点,一次为基准,求出长和宽。

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
int num;
cin>>num;
int graphic[100][100];//存储图形的点
int i=0,j=0,rightEst,bottumEst;//求出右下角的点
int width=0,lengh=0;
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
scanf("%d",&graphic[i][j]);
if(graphic[i][j]==0){
rightEst=i;bottumEst=j;//求出右下角的点
}
}
}
for(i=rightEst,j=bottumEst;i>=0;i--){//求出宽
if(graphic[i][j]==0) width++;
else break;
}
for(i=rightEst,j=bottumEst;j>=0;j--){//求出长
if(graphic[i][j]==0) lengh++;
else break;
}
int portation=width*lengh-width*2-(lengh-2)*2;//求出面积减边上的点

cout <<portation<< endl;
return 0;
}追问

我想知道简单的方法,就是C那种我现阶段可以看懂并理解的方法~

追答

这个就是C语言啊。就是输入输出不一样嘛。没有什么问题吧。
这个算法是这样的。没有什么C语言不C语言的,不是你不懂C语言,是你对C语言的运用还不够灵活,要多学习别人的代码,不要老停留在老的思路上。你现在的阶段的水平看不懂这个代码,说明你不能写出来。不能理解。所以现在你应该来读懂这代码并理解他,下次尽量我取能自己实现它

第2个回答  推荐于2018-03-13
#include <stdio.h>
int main()
{
int a[100][100],i,j,t;
int m,n,x,y,sum=0,sum1=0;
scanf("%d",&t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
if(a[i][j]==0) {n=i;m=j;}
}

for(x=n,y=m;x>=0;x--)
{
if(a[x][y]==0) sum=sum+1;
else break;
}
for(x=n,y=m;y>=0;y--)
{
if(a[x][y]==0) sum1=sum1+1;
else break;
}

printf("%d\n",sum*sum1-2*(sum+sum1-2));
return 0;
}
这样的呢本回答被网友采纳
相似回答