给定数字1到n^2,
要求将这些数字填入n*n的格子当中使得,每行每列每个对角线的数字之和都是奇数
很显然如果n是偶数 那么只要按照顺序填下来就行了
如果n是奇数,我们可以发现一个性质,所有数字之和为(1+n^2)*(n^2)/2,而这个数必定能被3整除
(大概可以证明)
那么对于这个构造问题就从要求每行每列每对角线之和为奇数
变成了 对于每行每列每对角线之和相等
这个问题是一个小学奥数题。。随便搞搞就好了 这个叫什么方法我也记不得了 大概叫对角线填补法?
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;
#define sp system("pause")
typedef long long ll;
typedef pair<int, int> pii;
int ma[70][70];
pii trans(pii a,int n)
{
if (a.first < 0 )
a.first = n + a.first;
else if (a.first >= n)a.first = a.first - n;
if (a.second < 0)
a.second = n + a.second;
else if (a.second >= n)a.second -= n;
return a;
}
int main()
{
memset(ma, 0, sizeof ma);
int n;
cin >> n;
if (n & 1)
{
int cot = 1;
int sx = n / 2 , sy = -(n/2);
for (int i = 0; i < n; i++)
{
int tx = sx, ty = sy;
for (int j = 0; j < n; j++)
{
pii a = trans(pii(tx, ty),n);
ma[a.second][a.first] = cot++;
tx--, ty++;
}
sx++, sy++;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j)printf(" ");
printf("%d", ma[i][j]);
}
printf("\n");
}
}
else
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j)printf(" ");
printf("%d", i*n + j+1);
}
printf("\n");
}
}
//sp;
}