您的位置:首页 > 其它

FOJ--1214--Density Map

2009-07-22 10:20 381 查看
题目大意:输入两个整数n,r。n是行数和列数,r是允许的距离。距离公式是max(|i-i'|,|j-j'|)。最后求每个点在允许的距离范围内的所有点的值的和。

思路一:

分析:先输入全部数。然后在一个点一个点的找。就是找出这个点的允许范围,在以这个范围为一个二维数组,求这个数组的全部数的和。

结果:我发现提交会超时,循环语句太多了,应该换个思路。

代码如下:(哪位朋友能帮我改进下)

#include <stdio.h>
#include <string.h>
int main()
{
int n,m,i,j,k,l,min_x,min_y,max_x,max_y;
int a[250][250],b[250][250];
while (scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<250;i++)
memset(b[i],0,sizeof(b[i]));
for (i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i-m>=0)
min_x=i-m;
else
min_x=0;
if(i+m<=n-1)
max_x=i+m;
else
max_x=n-1;
if(j-m>=0)
min_y=j-m;
else
min_y=0;
if(j+m<=n-1)
max_y=j+m;
else
max_y=n-1;
for(k=min_x;k<=max_x;k++)
for(l=min_y;l<=max_y;l++)
b[i][j]+=a[k][l];
}
}
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d",b[i][j]);
if(j!=n-1)
printf(" ");
}
printf("/n");
}
}
return 0;
}


思路二:

想法与思路一差不多,不过是输入一个数就处理。当输入的数为0不处理。为1就做如下操作:

找出该位位置允许的范围,然后每个位置都加上这个数。发现还是超时。 - -||

代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
int n,m,i,j,k,l,min_x,min_y,max_x,max_y;
int a[250][250],b[250][250];
while (scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<250;i++)
memset(b[i],0,sizeof(b[i]));
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]!=0)
{
if(i-m>=0)
min_x=i-m;
else
min_x=0;
if(i+m<=n-1)
max_x=i+m;
else
max_x=n-1;
if(j-m>=0)
min_y=j-m;
else
min_y=0;
if(j+m<=n-1)
max_y=j+m;
else
max_y=n-1;
for(k=min_x;k<=max_x;k++)
for(l=min_y;l<=max_y;l++)
b[k][l]+=a[i][j];
}
}
}
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d",b[i][j]);
if(j!=n-1)
printf(" ");
}
printf("/n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: