解线性方程组,高斯消元
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define maxN 105
#define maxn 5000
#define maxm 5000
int h,w,d;
int a[maxN][maxN];
int b[maxN][maxN];
#define eps 1e-9
double Mat[maxn][maxm];
double V[maxn];
void Gasse(int n,int m)
{
int k=0,i,j;
for(j=0;j<m;j++)
{
for(i=k;i<n;i++){
if(fabs(Mat[i][j])>eps)
break;
}
if(i==n) continue;
for(int p=0;p<m;p++) swap(Mat[i][p],Mat[k][p]);
swap(V[i],V[k]);
double tem=Mat[k][j] ;
for(int p=j;p<m;p++) Mat[k][p]/=tem;
V[k]/=tem;
for(int p=0;p<n;p++){
if(p!=k&&(fabs(Mat[p][j])>eps)){
tem=Mat[p][j];
for(int q=0;q<m;q++)Mat[p][q]-=tem*Mat[k][q];
V[p]-=tem*V[k];
}
}
k++;
}
}
int main()
{
scanf("%d%d%d",&h,&w,&d);
for(int i=0;i<h;i++)
for(int j=0;j<w;j++) scanf("%d",&a[i][j]);
for(int i=0;i<h-d+1;i++)
for(int j=0;j<w-d+1;j++) scanf("%d",&b[i][j]);
int r=0;
for(int i=0;i<h-d+1;i++)
for(int j=0;j<w-d+1;j++){
for(int p=0;p<d;p++)
for(int q=0;q<d;q++)
Mat[r][p*d+q]=a[i+p][j+q];
V[r]=b[i][j];
r++;
}
Gasse(r,d*d);
for(int i=0;i<d*d;i++){
if(i%d!=0) printf(" ");
if(V[i]>-1e-6) printf("%.0f",(V[i]+1e-6));
else printf("%.0f",(V[i]-1e-6));
if(i%d==d-1) printf("\n");
}
}