题意:H * W (W,H <= 10) 的矩阵A的某个元素A[i][j],从它出发到其他点的曼哈顿距离小于等于D的所有值的和S[i][j]除上可达点的数目,构成了矩阵B。给定矩阵B,求矩阵A。
题解:将所有矩阵A的元素看成自变量,一共有H*W个变量,每个矩阵B的元素是由这些变量组合而成的,对于固定的B[i][j],曼哈顿距离在D以内的A[x][y]的系数为1,其它为0,这样就变成了求H*W个变量和H*W个方程的线性方程组,高斯消元求解。
注意是先读入M列然后才是N行。。
坑爹DFS跪了好久郁闷。。应该写BFS建图的。。。
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
#define exp 1e-12
double a[120][120];
double x[120];
int mmm[120][120];
int used[120][120];
int move[4][2]= {{0,1},{-1,0},{1,0},{0,-1}};
int n,m;
int ans;
int equ,var;
void debug()
{
for(int i=0; i<equ; i++)
{
for(int j=0; j<=var; j++) printf("%.0f ",a[i][j]);
puts("");
}
puts("");
}
void gauss()
{
int i,j;
int row,col;
for(row=0,col=0; row<equ&&col<var; row++,col++)
{
int maxr=row;
for(i=row+1; i<equ; i++) if((fabs(a[i][col])-fabs(a[maxr][col]))>0) maxr=i;
for(i=0; i<=var; i++) swap(a[row][i],a[maxr][i]);
for(i=row+1; i<equ; i++)
{
if(fabs(a[i][col])>exp)
{
double tep=a[i][col]/a[row][col];
for(j=col; j<=var; j++)
a[i][j]-=a[row][j]*tep;
}
}
}
for(i=row-1; i>=0; i--)
{
double tep=a[i][var];
for(j=i+1; j<var; j++)
{
if(fabs(a[i][j])<=exp) continue;
tep-=a[i][j]*x[j];
}
x[i]=tep/a[i][i];
}
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
printf("%8.2lf",x[i*m+j]);
puts("");
}
return ;
}
int ok(int x,int y)
{
if(x<0||y<0||x>=n||y>=m) return 0;
if(used[x][y]==1) return 0;
return 1;
}
void dfs(int t,int l,int x,int y,int tep)
{
if(mmm[x][y]==0)
{
ans++;
mmm[x][y]=1;
}
used[x][y]=1;
a[tep][x*m+y]=1;
if(t==l)
{
return ;
}
int i,xx,yy;
for(i=0; i<4; i++)
{
xx=x+move[i][0];
yy=y+move[i][1];
if(ok(xx,yy))
{
dfs(t+1,l,xx,yy,tep);
used[xx][yy]=0;
}
}
return ;
}
int main()
{
int d;
int cas=1;
while(scanf("%d%d%d",&m,&n,&d),n)
{
if(cas!=1) puts("");
int i,j;
memset(a,0,sizeof(a));
equ=var=n*m;
for(int i=0; i<n; i++) for(int j=0; j<m; j++) cin>>a[i*m+j][var];
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
int tep=i*m+j;
memset(used,0,sizeof(used));
memset(mmm,0,sizeof(mmm));
ans=0;
dfs(0,d,i,j,tep);
a[tep][var]*=ans;
}
}
gauss();
cas++;
}
}