https://www.nowcoder.com/acm/contest/201/G
POINT:

看题解就好
#include <stdio.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
#define LL long long
const int N = 1111+55;
int b[1111][1111];
int a[1111][1111];
int c[17]={0,1,2,3,4,4,3,2,1,2,1,4,3,3,4,1,2};
void printf_(int n)
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d%c",b[i][j],j==n?'\n':' ');
}
}
}
void f(int n)
{
if(n&1){
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=n-i+2;j<=n;j++)
b[i][++cnt]=j;
for(int j=1;j<n-i+2;j++)
b[i][++cnt]=j;
}
}else if(n==4){
for(int i=1;i<=4;i++){
int cnt=0;
for(int j=(i-1)*4+1;j<=i*4;j++){
b[i][++cnt]=c[j];
}
}
}else{
f(n/2);
for(int i=1;i<=n/2;i++){
for(int j=1;j<=n/2;j++){
a[i][j]=b[j][i];
a[i][j]--;
if(a[i][j]==0) a[i][j]=n/2;
}
}
for(int i=n/2+1;i<=n;i++){
for(int j=1;j<=n/2;j++){
b[i][j]=a[i-n/2][j];//左下
}
for(int j=n/2+1;j<=n;j++){
b[i-n/2][j]=b[i-n/2][j-n/2];//右上
b[i][j]=b[i-n/2][j-n/2]+n/2;//右下
}
}
for(int i=1;i<=n/2;i++){
for(int j=1;j<=n/2;j++){
b[j][i]+=n/2;
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
if(n==1){
printf("1\n");
}else if(n==2){
printf("-1\n");
}else{
f(n);
printf_(n);
}
}

本文深入探讨了一种用于构造特殊矩阵的递归算法,该算法能够根据输入的矩阵大小生成具有特定规律的数字填充矩阵。文章通过详细的代码示例,展示了如何根据不同条件选择合适的递归策略,包括奇数矩阵、4x4矩阵以及偶数矩阵的处理方法。此外,还提供了一个打印矩阵的辅助函数,便于验证算法的正确性和输出结果。
413

被折叠的 条评论
为什么被折叠?



