本来是想好好打的,但是刚安装上了中国式家长,太想玩了,一直在玩玩玩玩玩,
玩到两点多,写了两个签到又开始玩,玩玩玩然后写了一下g又开始玩,玩玩玩,然后下午就写了两个签到和一个g题
奇怪的是,感觉其他题目都挺麻烦的,过了几百个人,这题才28个人
为了不显得下午什么事情都没干,写一下这个题的题解……
可以简单发现奇数是肯定可以构造的,2肯定不可以构造,2的倍数需要一些操作
然后因为4是可以构造的所以如果是2的倍数不能一直递归到4,建了一个q矩阵(手捏出来的4的解法)来对应
一直二分和旋转强行找到解法
#include<iostream>
#include<algorithm>
#include<math.h>
#define N 1000005
using namespace std;
int mp[1005][1005];
int q[4][4]={0,3,1,2,
2,1,3,0,
3,0,2,1,
1,2,0,3};
/* */
void dfs(int step, int n,int minn, int x1,int y1, bool rot){
if (n==4){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
//mp[x1+(i+j)%n][y1]=(rot?(n-1-q[i]):i)+minn;
mp[x1+i][y1+j]=(rot?q[3-j][i]:q[i][j])+minn;
}
}
return;
}
else if (n%2){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
mp[x1+j][y1+(i+j)%n]=(rot?(n-1-i):i)+minn;
}
}
return;
}
else{
if (!rot){
dfs(step+1,n/2,minn,x1,y1,0);
dfs(step+1,n/2,minn+n/2,x1,y1+n/2,1);
dfs(step+1,n/2,minn+n/2,x1+n/2,y1,0);
dfs(step+1,n/2,minn,x1+n/2,y1+n/2,0);
}
else{
dfs(step+1,n/2,minn+n/2,x1,y1,0);
dfs(step+1,n/2,minn,x1,y1+n/2,0);
dfs(step+1,n/2,minn,x1+n/2,y1,0);
dfs(step+1,n/2,minn+n/2,x1+n/2,y1+n/2,0);
}
}
}
int check(int n){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (mp[i][j]==mp[j][i]&&i!=j) return false;
}
}
return true;
}
int main(){
int n; scanf("%d",&n);
if (n==2) printf("-1");
else {
if (n%2){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
mp[j][(j+i)%n]=i;
}
}
}
else{
dfs(0,n,0,0,0,0);
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (j) printf(" ");
printf("%d",mp[i][j]+1);
}
printf("\n");
}
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容