牛客國慶集訓派對day1 G Kimi to Kanojo to Kanojo no Koi(構造矩陣)

題目鏈接

本來是想好好打的,但是剛安裝上了中國式家長,太想玩了,一直在玩玩玩玩玩,

玩到兩點多,寫了兩個簽到又開始玩,玩玩玩然後寫了一下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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章