1.问题描述
有一条“封闭”曲线划定的地图,界定曲线上的点有“1“表示,曲线内外的点用“0”表示(具体数据由另文件提供)。
试实施图形点扫描,统计地图的面积即“封闭”曲线内“0”点数。
2.设计思路
要统计用“1”标识的标识的封闭曲线内“0”点的点数,关键在于如何识别哪些“0”点在封闭曲线内,哪些“0”点在封闭曲线外。
试对封闭曲线外的“0”点实施“扩散传染”处理,处理成“2”点,以与曲线的“0”点相区别。考虑到连续曲线可能复杂的弯曲变化,用简单一次穷举难以区分曲线内与外的“0”,可把曲线外的“0”通过金疮“扩散传染”逐个变为“2”,因封闭曲线隔离使得曲线内的“0”保持不变。
1.四周边上的“0”无疑在曲线外,变为“2”。
2.凡与“2”相邻的“0”点通过“传染”变为“2”。即判断每一个“0”点,若它的上下左右元素中有某一个为“2”点,即被扩散传染为“2”。
3.约定扫描x*y(即图中点的个数)次。设置变量flag,每次扫描前,flag=0;凡有扩散传染发生,flag=1。每次扫描后检验,如果flag=0,表示该次扫描没有传染发生,即停止。
4.统计“0”的点数即为所求封闭曲线的面积。
3.代码实现
#define MAXSIZE 80
int main(void)
{
FILE *fp;
char buff[MAXSIZE], map[MAXSIZE][MAXSIZE];
int i, flag, row, column, xpos, ypos, temp;
printf("=============================================/n");
printf("统计一个地图文件,1围成的封闭曲线中,0的个数/n");
printf("=============================================/n/n");
if (NULL == (fp = fopen("map.txt", "rb")))
{
printf("The file was not opened./n");
exit(1);
}
xpos = 0;
row = 0;
// 将fp指向的文件复制到二维map数组中,并统计列ypos和行xpos的大小
while (!feof(fp))
{
fgets(buff, MAXSIZE, fp);
fputs(buff, stdout); // 将原文件输出
strcpy(map[row++], buff); // 将数据存放到二维map数组中
// 确定行数
xpos++;
}
printf("/n/n/n");
// 确定列数
ypos = strlen(buff);
// 下面代码实现边上0转换为2
for (column = 0; column < ypos; column++)
{
if ('0' == map[0][column])
map[0][column] = '2';
if ('0' == map[xpos - 1][column])
map[xpos - 1][column] = '2';
}
for (row = 0; row < xpos; row++)
{
if ('0' == map[row][0])
map[row][0] = '2';
if ('0' == map[row][ypos - 1])
map[row][ypos - 1] = '2';
}
temp = xpos * ypos;
for (i = 1; i < temp; i++)
{
flag = 0;
for (row = 1; row < xpos; row ++)
for (column = 1; column < ypos; column++)
if (('2' == map[row][column - 1] || '2' == map[row][column + 1] ||
'2' == map[row + 1][column] || '2' == map[row - 1][column]) && '0' == map[row][column])
{
map[row][column] = '2';
flag = 1; // 若上下左右有一个是2的,0转化为2
}
if (!flag)
break;
}
// 统计曲线内“0”的个数
int total = 0;
for (row = 0; row < xpos; row++)
for (column = 0; column < ypos; column++)
if ('0' == map[row][column])
total++;
printf("The number of character '1' in this file is %d./n", total);
fclose(fp);
return 0;
}
参考文献:《趣味C程序设计》