牛客国庆集训派对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;
}

 

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