这道题是个规律题;我开始读题的时候,很是懵逼,这怎么搞?后来看了大佬的博客,我才知道有这么一个规律:
比如:
这个是44的矩阵,按着顺序放,可以发现每行没列异或和都为0;
而且题上又说了n是4的倍数;所以可以分块放了;什么意思呢?就是这个意思:
这样每个44异或都为0,那么对应的行或者对应的列合起来异或和为0;这样就够找出来了;那么我只需要从左往右填数字就行了;
AC代码:
#include<bits/stdc++.h>
using namespace std;
int ans[1500][1500];
int val;
void Fill(int x,int y){//填
for(int i=x;i<x+4;i++){
for(int j=y;j<y+4;j++){
ans[i][j]=val++;
}
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i+=4){//分块,因为0过了下标就位4了
for(int j=0;j<n;j+=4){//同理上面
Fill(i,j);
}
}
for(int i=0;i<n;i++)//输出
for(int j=0;j<n;j++)
printf("%d%c",ans[i][j],j==4*n-1?'\n':' ');
return 0;
}