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
- N阶幻方
- n阶幻方
- N阶幻方
- N阶幻方
- N阶幻方,任意阶幻方
- n阶幻方的构造
- N阶幻方问题
- N阶幻方问题
- 【数学】n阶幻方
- N!
- N!
- n
- N
- N!
- N!
- N!
- N!
- n!
- AndroidStudio打包报错:duplicate entry
- javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'. Check t
- Word Ladder
- 数据结构之时间复杂度和空间复杂度
- Linux进程间通信的几种方式总结
- N阶幻方
- 笔试题88.腾讯2017暑期实习生笔试题(有趣数字)
- HTML表格标签
- c3p0,druid,dbcp的性能比较
- 909422229__XML的实体引用
- nyoj 1112求次数 STL
- 网络流24题——飞行员配对方案问题
- 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
- Android Support Design Library使用详解