N阶幻方

来源:互联网 发布:windows 32位 64位 编辑:程序博客网 时间:2024/06/05 21:03
#include <stdio.h>#include <algorithm>#include <iostream>#include <string>#include <vector>#include <time.h>#include <string.h>#include <map>using namespace std;const int N = 1e2 + 10;int arr[N][N];int mod(int x, int m) {  while (x > m)    x -= m;  return x;}void output(int n) {  for (int i = 1; i <= n; i++) {    for (int j = 1; j <= n; j++)      cout << arr[i][j] << "\t";    cout << endl;  }  cout << endl;}bool check(int n) {  int sum = n * (n * n + 1) / 2;  cout << sum << endl;  int sumleft = 0, sumright = 0;  for (int i = 1; i <= n; i++) {    sumleft += arr[i][i];    sumright += arr[i][n - i + 1];    int tmp1 = 0, tmp2 = 0;    for (int j = 1; j <= n; j++) {      tmp1 += arr[i][j];      tmp2 += arr[j][i];    }    if (tmp1 != sum || tmp2 != sum)      return false;  }  if (sumleft != sum || sumright != sum)    return false;  return true;}void change(int n, int sx, int sy) {  int sum = (1 + n * n);  int ex = sx + 3;  int ey = sy + 3;  arr[sx][sy] = sum - arr[sx][sy];  arr[ex][ey] = sum - arr[ex][ey];  arr[sx][ey] = sum - arr[sx][ey];  arr[ex][sy] = sum - arr[ex][sy];  sx++, sy++, ex--, ey--;  arr[sx][sy] = sum - arr[sx][sy];  arr[ex][ey] = sum - arr[ex][ey];  arr[sx][ey] = sum - arr[sx][ey];  arr[ex][sy] = sum - arr[ex][sy];}int rob(int sx, int sy, int n, int num) {  int nx = sx, ny = sy + n / 2;  for (int i = 0; i < n * n; i++) {    arr[nx][ny] = num++;    int tx = sx + mod((nx - 1) + n, n) - 1;    int ty = sy + mod(ny + 1, n) - 1;    if (arr[tx][ty] != 0) {      nx = sx + mod(nx + 1, n) - 1;    }    else {      nx = tx;      ny = ty;    }  }  return num;}int main() {  int n;  while (cin >> n) {    memset(arr, 0, sizeof(arr));    if (n & 1) {      rob(1, 1, n, 1);    }    else {      if (n % 4 == 0) {        for (int i = 1; i <= n; i++)          for (int j = 1; j <= n; j++)            arr[i][j] = (i - 1) * n + j;        for (int i = 1; i <= n; i += 4)           for (int j = 1; j <= n; j += 4)            change(n, i, j);      }      else {        int num = 1, k = (n - 2) / 4, m = n / 2;        num = rob(1, 1, m, num);        num = rob(1 + m, 1 + m, m, num);        num = rob(1, 1 + m, m, num);        num = rob(1 + m, 1, m, num);        for (int i = 1; i <= m; i++) {          for (int j = 1; j <= k; j++) {            if (i != m / 2 + 1)              swap(arr[i][j], arr[i + m][j]);            else              swap(arr[i][j + k], arr[i + m][j + k]);          }        }        for (int i = 1; i <= m; i++) {          for (int j = 0; j < k - 1; j++) {            int nj = j + m + 1 + m / 2;            swap(arr[i][nj], arr[i + m][nj]);          }        }      }    }    output(n);    if (check(n))      puts("YES");    else      puts("NO");  }  return 0;}
0 0
原创粉丝点击