牛客國慶集訓排隊day1 G Kimi to Kanojo to Kanojo no Koi
阿新 • • 發佈:2018-12-13
本來是想好好打的,但是剛安裝上了中國式家長,太想玩了,一直在玩玩玩玩玩,
玩到兩點多,寫了兩個簽到又開始玩,玩玩玩然後寫了一下g又開始玩,玩玩玩,然後下午就寫了兩個簽到和一個g題
為了不顯得下午什麼事情都沒幹,寫一下這個題的題解……
可以簡單發現奇數是肯定可以構造的,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; }