Not Adjacent Matrix(cf#719 div3 C)

原题链接

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

3
1
2
3

输出样例

1
-1
2 9 7
4 6 3
1 8 5


题目大意: 给定一个 n * n 的矩阵,需要在该矩阵中填上 1 ~ n * n 个数,使得每个方格与它相邻(上下左右)的方格中的数字不相邻( 即两数差的绝对值不为1 ),求是否能构造出符合要求的矩阵并输出任意一种可行的方案。

理所当然的规律 + 构造题,看样例的时候脑子一热觉得是奇数行偶数不行,然而很被驳回了。由于规定相邻的方格中的数字不能相邻,因此可以考虑通过 + 2 避过相邻数字,即按顺序将奇数和偶数分开存放,例当 n = 4 时 ,可构造为:

1 3 5 7
9 11 13 15
2 4 6 8
10 12 14 16

由此可发现只有当 n = 1 或 n = 2 时需要分类讨论,而对于其他情况,则根据数字大小先输出奇数再输出偶数即可。

参考代码

#include <bits/stdc++.h>
using namespace std;

int main(){
    
    
	int t;
	cin>>t;
	while(t--){
    
    
		int n,flag=0;
		cin>>n;
		if(n==1){
    
    
			cout<<"1"<<endl;
			continue;
		}
		if(n==2){
    
    
			cout<<"-1"<<endl;
			continue;
		}
		
		int pos=1;
		
		for(int i=1;i<=n;i++){
    
    
			for(int j=1;j<=n;j++){
    
    
				printf("%d ",pos);
				pos+=2;
				if(pos>n*n&&flag==0){
    
    
					flag=1;
					pos=2;
				}
			}
			cout<<endl;
		}
		cout<<endl;
	}
}

おすすめ

転載: blog.csdn.net/laysan/article/details/120169087