22:神奇的幻方

来源:互联网 发布:sql如何调用存储过程 编辑:程序博客网 时间:2024/04/28 09:02

原题链接

总时间限制: 
1000ms 
内存限制: 
65535kB
描述

幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
    a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
    b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
    c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方

输入
一个数字N(N<=20)
输出
按上方法构造的2N-1 * 2N-1的幻方
样例输入
3
样例输出
17 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9

源码

#include <iostream>using namespace std;int main(){    int A[40][40]={0};    int N, i, j, value, size;    cin >> N;    size = (2*N-1)*(2*N-1);    i = 0;    j = N-1;    for (value=1; value<=size; value++){        A[i][j] = value;        if (i==0 && j==(2*N-2)) // 右上角            i++;        else{            if (i == 0){ // 第一行                i = 2*N-2;                j++;            }            else if (j == 2*N-2){ // 最后一列                i--;                j = 0;            }            else{ // 右上方                i--;                j++;            }        }        if (A[i][j] != 0){ // 右上方已有数字            i += 2;            j--;        }    }    for (i=0; i<(2*N-1); i++){        for (j=0; j<(2*N-1); j++)            cout << A[i][j] << " ";        cout << endl;    }    return 0;}