原题链接:CF1520C Not Adjacent Matrix - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
知识点:模拟
题目大意:构造一个 n*nn∗n 的矩阵,使得相邻的两个格子填的数不能相邻。
解题思路:最重要的是理解 “使得相邻的两个格子填的数不能相邻。” 即相邻的格子对应数不能是挨着的。
举个例子:
这样的话,1与2相邻,2与3相邻,3与4相邻,4与5相邻,5与6相邻,6与7相邻,7与8相邻,9相
邻,不满题意。
那么,如果我们先将奇数全部输出,再将偶数输出。或者先将偶数全部输出,再输出奇数。那么就可以避免相邻格子的数相邻。
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;//t组数据
int a;//网格大小为a
while(t--)
{
cin>>a;
if(a==1)//网格大小为1
{
cout<<"1"<<"\n";//输出形状为1
continue;
}
if(a==2)//网格大小为2*2
{
cout<<"-1"<<"\n";//不管怎样排布,都会存在相邻
continue;
}
int cnt=0;//计数
for(int i=1;i<=a*a;i++)//进行遍历
{
if(i%2==1)//是奇数
{
cout<<i<<" ";//先输出
cnt++; //计数++
}
if(cnt==a)//如果计数满网格边长
{
cout<<"\n";//进行换行
cnt=0;//计数归零
}
}
for(int i=1;i<=a*a;i++)//进行遍历
{
if(i%2==0)//是偶数
{
cout<<i<<" ";//后输出
cnt++;//计数++
}
if(cnt==a)//计数满网格边长
{
cout<<"\n";//换行
cnt=0;
}
}
}
return 0;
}