牛客国庆集训派对Day1 - G Kimi to Kanojo to Kanojo no Koi (构造)
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);
}
}