| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴上我这个神奇的程序(结构体数组开1都能过)#include"iostream"
#include"cmath"
#define M 101
#define MIN 1e-9
using namespace std;
int ma[M][M];/*存图*/
int de[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
int W,H;
int s;
int num;
typedef struct node
{
int x,y;
}point;
point p[1];
int ll;
void dfs(int i,int j)
{
int k;
ma[i][j]=num; /*更改图中的值,与f对应*/
p[ll].x=i;/*获取图中像素点的位置*/
p[ll++].y=j;
for(k=0;k<8;k++)
{
int x=i+de[k][0],y=j+de[k][1];
if(x>=0&&x<H&&y>=0&&y<W&&ma[x][y]==1)
dfs(x,y);
}
}
double dis(point *a,int n)/*求一个图的标志*/
{
double sum=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
sum+=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)*1.0+(a[i].y-a[j].y)*(a[i].y-a[j].y)*1.0);
return sum;
}
int main()
{
while(scanf("%d%d",&W,&H)!=EOF)
{
int i,j;
char str;
double clu[27];
char f[400];
for(i=0;i<2;i++)
f[i]='0';
int ss=1;
num=2;
clu[0]=0.01111;
for(i=0;i<H;i++)
{
getchar();
for(j=0;j<W;j++)
{ scanf("%c",&str);
ma[i][j]=str-'0';
}
}
for(i=0;i<H;i++)
for(j=0;j<W;j++)
{
if(ma[i][j]==1)
{
int l;
ll=0;
dfs(i,j);/*图从2开始存*/
double sum=dis(p,ll);
for(l=0;l<ss;l++)/*在已经存在的标志中比较*/
{
if(fabs(clu[l]-sum)<MIN)/*存在相同的标志*/
{
f[num]=l+'a'-1;
break;
}
}
if(l>=ss)/*不存在相同的标志*/
{
f[num]=ss+'a'-1;
clu[ss]=sum;/*生成新的标志*/
ss++;
}
num++;
}
}
for(i=0;i<H;i++)
{
for(j=0;j<W;j++)
printf("%c",f[ma[i][j]]);
printf("\n");
}
}
//system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator