地图扫描

来源:互联网 发布:属下知罪by 生子番外 编辑:程序博客网 时间:2024/06/05 23:49

扫描统计 是程序设计拓展求和的一个基本课题。
有一条封闭曲线划定的地图,界定曲线上的点用“1”表示,曲线内外的点用“0”表示(具体数据由内外的的文件提供)。
试实施图形点扫描,统计地图的面积(即“封闭”曲线内的“0”点数)。

1.说明:

要统计用“1”标识的封闭曲线内“0”点的点数,关键在于识别哪些“0”点在封闭曲线内,哪些“0”在封闭曲线外。

试对封闭曲线外的“0”点实施“扩散传染”处理,例如处理成“2”点,以与曲线内的“0”点相区别。考虑到连续曲线可能复杂的弯曲变化,用简单一次枚举检测难以区分曲线内与外的“0”,可以把曲线外的“0”通过多次“扩散传染”逐个变为“2”,因为封闭曲线隔离使得曲线内的“0”保持不变。
——————————
(1)、四周边上的“0”无疑在曲线外,变为“2”;
(2)、凡与“2”相邻的“0”点通过“扩散传染”变为“2”,即判断每一个“0”点,若它的上下左右元素中有某一个为“2”点,即被扩散传染为“2”;
(3)、约定扫描x*y(即图中点的个数)次,设置变量w,每次扫描前w=0;凡有扩散传染发生,w=1。每次扫描后检验,如果w=0,表示该次扫描没有传染发生,即停止;
(4)统计“0”的点数即为所求封闭曲线的面积。

2.程序设计:

#include<stdio.h>int main(){   FILE *fp;   char fname[50]; /*文件名长度在此约定不大于50,包含扩展名*/   int i,j,x,y,k,s,w,t,a[12][12];   printf("\n input file name: ");      gets(fname);   if((fp==fopen(fname,"r")==NULL))   {      printf("The file was not opend\n");   }   x=11;y=11;   for(i=0;i<=y;++i)   {      printf("\n     ");         for(j=0;j<=x;++j)         {            fscanf(fp,"%d",&a[i][j]);/*从文件读数据到二维a数组*/            printf("%d",a[i][j]);         }   }   for(i=0;i<=x;++i)   {      if(a[0][i]==0)         a[0][i]=2; /*把边上0转化为2*/      if(a[y][i]==0)         a[y][i]=2;   }   for(i=1;i<y;++i)   {      if(a[i][0]==0)         a[i][0]=2;      if(a[i][x]==0)         a[i][x]=2;   }   t=x*y;   for(k=1;k<t;++k)   {      w=0;      for(i=1;i<y;++i)         for(j=1;j<x;++j)            if((a[i][j-1]==2||a[i][j+1]==2||a[i-1][j]==2||a[i+1][j]==2)&&a[i][j]==0)            {               a[i][j]=2;/*若0的上下左右之一为2,则0转化为2*/               w=1;            }      if(w==0)         break;   }   s=0;   printf("\n");   for(i=0;i<=y;++i)   {      printf("\n     ");      for(j=0;j<=x;++j)      {         if(a[i][j]==0)            s+=1;   /*统计曲线内的“0”点数*/         printf("%d",a[i][j]);  /*输出处理后的地图*/      }   }   printf("\n     s=%d\n",s);   fclose(fp);}

3.程序运行示例及其注意事项:
运行程序,读入数据表 dt191.txt 中的数据,统计如图所示;

        地图原始数据                input file name:  dt191.txt   0 0 0 1 0 0 0 1 0 1 1 0  0 1 1 0 1 0 1 0 1 0 0 1  1 0 0 0 0 1 0 0 0 0 1 1  1 0 0 0 0 0 0 0 0 1 0 0  0 1 0 0 0 1 0 0 0 0 1 0  1 0 0 0 1 0 1 1 0 0 0 1  0 1 0 1 0 0 0 1 0 0 1 0  0 1 0 1 0 0 1 0 0 1 0 0   1 0 0 0 1 0 0 1 0 0 1 0  0 1 0 0 0 1 0 0 1 0 0 1  0 0 1 0 0 1 0 0 1 0 1 0  0 0 0 1 1 0 0 0 0 1 0 0        处理统计结果  2 2 2 1 2 2 2 1 2 1 1 2  2 1 1 0 1 2 1 0 1 0 0 1  1 0 0 0 0 1 0 0 0 0 1 1  1 0 0 0 0 0 0 0 0 1 2 2  2 1 0 0 0 1 0 0 0 0 1 2  1 0 0 0 1 2 1 1 0 0 0 1  2 1 0 1 2 2 2 1 0 0 1 2  2 1 0 1 2 2 1 0 0 1 2 2   1 0 0 0 1 2 2 1 0 0 1 2  2 1 0 0 0 1 2 2 1 0 0 1  2 2 1 0 0 1 2 2 1 0 1 2  2 2 2 1 1 2 2 2 2 1 2 2  s=52

注意:通过数据文件也是向程序提供数据的方式之一,尤其是面对大批量的数据,从文件输入要比逐个从键盘输入简单得多。

1 0
原创粉丝点击