hdu 3359
开始看了半天题目,才搞懂题意,orz!
The Manhattan Distance (sometimes called the Taxicab distance) betweentwo points is the sum of the (absolute) difference of their coordinates.
即是俩个点的横纵坐标的绝对值得和,如果这个值小于D就符合要求。代码参照了大牛写的。注意不要把w和h弄反。。。
#include <cstdio>#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <cstring>
using namespace std;
double a[105][105];
double map[15][15];
int len;
void Debug(void)
{
int i, j;
for (i = 0; i < len; i++)
{
for (j = 0; j < len + 1; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void gauss()
{
int id,i,j,k;
double max,temp;
for(k=0;k<len;k++)
{
max=fabs(a[k][k]);
id=k;
for(i=k+1;i<len;i++)
{
if(max<fabs(a[i][k]))
{
max=fabs(a[i][k]);
id=i;
}
}
if(id!=k)
{
for(i=0;i<=len;i++)
swap(a[k][i],a[id][i]);
}
//Debug();
temp=a[k][k];//注意后面a[k][k]变化了,调了半天
for(i=k;i<=len;i++)
{
a[k][i]/=temp;
}
//Debug();
for(i=0;i<len;i++)
{
if(i!=k)
{
temp=a[i][k]; ;//注意后面a[i][k]变化了,调了半天
for(j=k;j<=len;j++)
{
a[i][j]=a[i][j]-a[k][j]*temp;
}
}
}
}
return;
}
int main()
{
int i,j,k,h,w,d,count,p,c,q,cas=1;
while(scanf("%d%d%d",&w,&h,&d)!=EOF)
{
if(h==0&&w==0&&d==0)
break;
else
if(cas!=1)
printf("\n");
cas++;
len=h*w;
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
scanf("%lf",&map[i][j]);
}
for(i=0;i<len;i++)
for(j=0;j<len;j++)
a[i][j]=0.0;
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
count=0;
c=i*w+j;
for(p=i-d;p<=i+d;p++)
for(q=j-d;q<=j+d;q++)
{
if((abs(p-i)+abs(q-j))<=d&&p>=0&&p<h&&q>=0&&q<w)
{
count++;
a[c][p*w+q]=1;
}
}
a[c][len]=count*map[i][j];
}
//Debug();
gauss();
for(i=0;i<len;i++)
{
printf("%8.2lf",a[i][len]);
if((i+1)%w==0)
printf("\n");
}
}
return 0;
}