- 题意
这个题我估计很多人都是卡到题意上了,妈的,公式一大堆。给一个N*N的矩阵和 3 ∗ 3 3*3 3∗3的矩阵,起初给的 3 ∗ 3 3*3 3∗3矩阵是K’,要想转换为K,只需将对应元素/矩阵元素的总和。定义矩阵
C ( A , K ) = C ( C [ A ] [ K ] , K ) C(A,K)=C(C[A][K],K) C(A,K)=C(C[A][K],K)
C [ A ] [ K ] C[A][K] C[A][K]是这样计算的:以 A [ i ] [ j ] A[i][j] A[i][j]作为 3 ∗ 3 3*3 3∗3矩阵的左上角,往右下扩展成 3 ∗ 3 3*3 3∗3的一个矩阵,如果出边界了,默认就是0。然后这个 3 ∗ 3 3*3 3∗3的矩阵和给的 K ( 3 ∗ 3 ) K(3*3) K(3∗3),对应位置的元素相乘在求一个和,作为新的 A [ i ] [ j ] A[i][j] A[i][j]值,遍历A的每一个元素,如此操作。这样A矩阵就得到了一次更新,让求进行无数遍后的矩阵A。
- 思路
K’中肯定只有一个元素不为0,这样才能保证K中的元素的和为1.
如果K中是1的元素不是A[1][1]的话,那么矩阵A最后就都是0,每一个操作都相当于将A中的元素往左或者往上或者左上方移动,无数次之后肯定都会被0填充了。
如果K中是1的元素是A[1][1]的话,那么A就一直不变。
- 另外,这个题数据出水了,太水了,尽管这样还是贴下代码吧
- 代码
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long ul;
typedef unsigned long long ull;
#define pi acos(-1.0)
#define e exp(1.0)
#define pb push_back
#define mk make_pair
#define fir first
#define sec second
#define scf scanf
#define prf printf
typedef pair<ll,ll> pa;
const ll INF=0x3f3f3f3f3f3f3f3f;
const ll MAX_T=120;
const ll MAX_N=50;
ll A[MAX_N][MAX_N],K[4][4],T,N;
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
ll i,j,k;
cin>>N;
for(i=1;i<=N;i++){
for(j=1;j<=N;j++)
cin>>A[i][j];
}
ll sum=0,,posx=-1,posy=-1;
for(i=1;i<=3;i++){
for(j=1;j<=3;j++){
cin>>K[i][j];
if(K[i][j]){
posx=i;
posy=j;
}
}
}
if(!(posx==1&&posy==1)){
for(i=1;i<=N;i++){
for(j=1;j<=N;j++){
if(j==1)
cout<<0;
else
cout<<' '<<0;
}
cout<<endl;
}
}
else{
for(i=1;i<=N;i++){
for(j=1;j<=N;j++){
ll X=i+posx-1;
ll Y=j+posy-1;
if(j!=1)
cout<<' ';
if(X>N||Y>N)
cout<<0;
else
cout<<A[X][Y];
}
cout<<endl;
}
}
}
return 0;
}