开启掘金成长之旅!这是我参与「掘金日新计划·2月更文挑战」的第16天,点击查看活动详情
2020(CCPC)-网选赛 1011 3×3 Convolution (HDOJ 6898)

乍一看,很难,仔细一分析,十分简单,解析如下:
这道题是一个简单的迭代。我们输入K'通过下面这个公式,将K'转换为K。
Example:
假设 ⎣⎡310003100031⎦⎤,A=[1324],n=2
C1,1=∑i=12∑j=12Ai,jKi,j=A1,1K1,1+A2,2K2,2=1×31+4×31=35
C1,2=∑i=12∑j=11Ai,j+1Ki,j=A1,2K1,1=2×31=32
C2,1=∑i=11∑j=12Ai,jKi,j=A21K11=3×31=1
C2,2=∑i=11∑j=11Ai+1,jKi,j=A22K11=4×31=34
C1=C(A,K)=[3513234]
C2=C(C′,K)
C1,12=∑i=12∑j=12Ci,j′Ki,j=C1,1′K1,1+C2,2′K2,2=35×31+34×31=1
C1,12=∑i=12∑j=11Ci,j+1′Ki,j=92
C1,12=1×3=31
C2,22=94
设limn→∞Cn(A,K)=[acbd]
b=limn→∞(31)n32=0,c=limn→∞1×(31)n=0,d=limn→∞34×31=0
同理:a=limn→∞(31)n×C(常数)=0
②同理: 如果输入的K‘不为0的数只有一个,那么通过迭代,最终的结果是原矩阵。所以输出第一个输入的矩阵即可。
综上所述,答案如下:
刚开始输出一个数N,输入一个N×N的二维数组
再输入一个3×3的二维数组:
如果这个二维数组之中,不为零的数字 ≥ 2,则输出一个全为0的二维数组,如果不为零的数字 < 2,那么原样输出第一轮输入的二维数组。
注意: 这道题卡输出矩阵最后一个数,不能有空格!!!
const int N = 1000;
int a[N][N];
int b[N][N];
int main() {
int t, cin >> t;
while(t--) {
int n = read();
int flag = 0;
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
cin >> a[i][j];
for(int i = 0;i < 3; i++) {
for(int j = 0; j < 3;j++) {
cin >> b[i][j];
if(b[i][j] != 0) flag++;
}
}
if (flag > 1) {
for (int i = 0;i < n; i++) {
for (int j = 0;j < n - 1; j++)
cout << 0 << " ";
cout << 0;
cout << endl;
}
} else {
for (int i = 0;i < n;i++) {
for (int j = 0;j < n - 1; j++)
cout << a[i][j] << " ";
cout << a[i][n - 1];
cout << endl;
}
}
}
return 0;
}