题意:把0~n^2-1 之间的所有数填进n*n的矩阵,让整个矩阵的横向和纵向异或和相同。
思路:
小技巧就是偶数与它下一个数 异或和为1,偶数开始的4个异或和为0,然后我们突发奇想 构造一个
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15 然后发现这个矩阵刚好符合。由于n能被4整除,我们可以分成n^2/16个矩阵,每个矩阵加上一个偏移量16就行了。由于后面的每个数 加上的偶数的16偏移量,对答案0是不影响的。
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1010;
int x[N];
int ans[N][N];
int cnt;
int n;
void solve(int x,int y)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
ans[x+i][y+j]=cnt++;
}
int main()
{
cin >> n;
for(int i=1;i<=n;i+=4)
for(int j=1;j<=n;j+=4)
solve(i,j);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<ans[i][j]<<' ';
cout<<endl;
}
return 0;
}