美文网首页
03 各种简单数字方阵

03 各种简单数字方阵

作者: _Mirage | 来源:发表于2020-07-22 15:41 被阅读0次
  1. n阶奇数幻方: image.png

    类似于这样一种n×n的矩阵,共有数字1 -- n * n,矩阵大小是n * n。
    矩阵特点是每行之和,每列之和,以及两条主辅对角线上的数字之和完全相等。(注意n为奇数)

n阶奇数幻方的生成特点:从第一行中间开始(初始为1),一直向右上角“走”,如果超过了边界,则跳转到边界对面(i方向跳转到最底边n,j方向跳转到最左边1)。

如此模拟即可:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

int nums[22][22];

void print(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%5d", nums[i][j]);
        }
        printf("\n");
    }
}

bool is_valid(int x, int n) {
    return 1 <= x && x <= n;
}

void solve(int n) {
    int i = 1, j = n / 2 + 1, cnt = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            nums[i][j] = -1;
        }
    }
    nums[i][j] = cnt++;
    while (cnt <= n * n) {
        i -= 1;
        j += 1;
        if (nums[i][j] == 0) {
            if (! is_valid(i, n) && ! is_valid(j, n)) {
                i++;
                j--;
                i++;
            }
            else if (is_valid(i, n)) {
                j = 1;
            }
            else if (is_valid(j, n)) {
                i = n;
            }
        }
        else if (nums[i][j] != -1) {
            i++;
            j--;
            i++;
        }
        nums[i][j] = cnt++;
    }
    print(n);
}

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    solve(n);

    return 0;
}
  1. 螺旋方阵: image.png

    特点是从左上角开始按照向右,向下,向左,向上的顺序循环往复。
    我们可以使用一个dirs二维数组来模拟每次可能走的方向。(注意如果改变螺旋方阵的螺旋方向,源码仅仅需要更改dirs方向数组的元素顺序即可)

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

int nums[22][22];
int dirs[][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

void print(int n) {
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            printf("%5d", nums[i][j]);
        }
        printf("\n");
    }
}

void solve(int n) {
    int cnt = 1, i = 1, j = 0, dir = 0, next_i, next_j;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            nums[i][j] = -1;
        }
    }
    while(cnt <= n * n) {
        next_i = dirs[dir][0] + i;
        next_j = dirs[dir][1] + j;
        i = next_i;
        j = next_j;
        if(nums[i][j] == -1) {
            nums[i][j] = cnt++;
        }
        else {
            i -= dirs[dir][0];
            j -= dirs[dir][1];
            dir++;
            if(dir == 4) dir = 0;
        }
    }
    print(n);
}

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    solve(n);

    return 0;
}
  1. 蛇形方阵(Z字型扫描): image.png

    同螺旋方阵差不多,特点是从左上角开始,前半段按照向右,左下,下,右上的顺序;后半段按照下,左下,右,右上的顺序进行模拟移动。
    我们可以使用一个dirs二维数组来模拟每次可能走的方向。(注意如果改变蛇形方阵的行走方向,源码仅仅需要更改dirs方向数组的元素顺序即可)

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

int nums[22][22];
int dirs[][2] = {{0, 1}, {1, -1}, {1, 0}, { -1, 1}};
int dirs_2[][2] = {{1, 0}, {1, -1}, {0, 1}, { -1, 1}};

void print(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%5d", nums[i][j]);
        }
        printf("\n");
    }
}

void solve(int n) {
    int dir = 0, cnt = 1, i = 1, j = 1, next_i, next_j;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            nums[i][j] = -1;
        }
    }
    nums[i][j] = cnt++;
    while (cnt <= n * n) {
        // 在一半以内
        if (i + j < n + 1) {
            next_i = i + dirs[dir][0];
            next_j = j + dirs[dir][1];
        }
        else {
            next_i = i + dirs_2[dir][0];
            next_j = j + dirs_2[dir][1];
        }
        i = next_i;
        j = next_j;
        if (nums[i][j] == 0) {
            i -= dirs[dir][0];
            j -= dirs[dir][1];
            dir++;
            if (dir == 4) dir = 0;
        }
        else {
            nums[i][j] = cnt++;
            if (dir != 1 && dir != 3) {
                dir++;
            }
        }
    }
    print(n);

}

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    solve(n);

    return 0;
}

另一种蛇形方阵:


image.png

原理一样,只需要改变dirs数组的元素即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

int nums[22][22];
int dirs[][2] = {{0, -1}, {1, 1}, {1, 0}, { -1, -1}};
int dirs_2[][2] = {{1, 0}, {1, 1}, {0, -1}, { -1, -1}};

void print(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%5d", nums[i][j]);
        }
        printf("\n");
    }
}

void solve(int n) {
    int dir = 0, cnt = 1, i = 1, j = n, next_i, next_j;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            nums[i][j] = -1;
        }
    }
    nums[i][j] = cnt++;
    while (cnt <= n * n) {
        // 在一半以内
        if (i < j) {
            next_i = i + dirs[dir][0];
            next_j = j + dirs[dir][1];
        }
        else {
            next_i = i + dirs_2[dir][0];
            next_j = j + dirs_2[dir][1];
        }
        i = next_i;
        j = next_j;
        if (nums[i][j] == 0) {
            i -= dirs[dir][0];
            j -= dirs[dir][1];
            dir++;
            if (dir == 4) dir = 0;
        }
        else {
            nums[i][j] = cnt++;
            if (dir != 1 && dir != 3) {
                dir++;
            }
        }
    }
    print(n);

}

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    solve(n);

    return 0;
}

相关文章

  • 03 各种简单数字方阵

    n阶奇数幻方:image.png类似于这样一种n×n的矩阵,共有数字1 -- n * n,矩阵大小是n * n。矩...

  • 2018-03-05 数字旋转方阵

    【问题】 输出N*N(1《N《10)的数字旋转方阵例如下面这个: 【分析】 首先这道题是《算法设计与分析》里的例题...

  • Python3 欧拉计划 问题11-15

    11、数字方阵中的最大乘积   在下面20×20的数字方阵中,以第7行第9列的数字26[加粗]开始,右下对角线方向...

  • 13罗马数转整数

    2019年04月19日 Day03 级别:简单 LeetCode 13 题目: 罗马数字转整数 罗马数字包含...

  • 【找到北】七方阵答疑

    毛竹: 下面,7方阵,十个问题,开始提 22315幸福很简单: 毛竹先生您好,我是七方阵63院的幸福很简单,我的问...

  • 矩阵基本概念

    矩阵一个 n x m 矩阵是由 n 行 m 列数字组成的数组 方阵如果矩阵的行数和列数相等,则称之为方阵 元素表示...

  • C语言算法设计之奇数魔方阵

    奇数魔方阵 将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所 示: 算法解...

  • C语言算法设计之奇数魔方阵

    将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所 示: 填魔术方阵的方法以...

  • 剑指Offer(一)

    题目汇总03.数组中重复的数字(简单),本题考查数组04.二维数组中的查找(简单),本题考查数组05.替换空格,本...

  • 《币圈笔记》第666期:我的666

    20年03月22日,简单又麻烦。 666期了,这是个吉利的数字,一个让人喜欢的数字。 最初666流行于电子游戏,当...

网友评论

      本文标题:03 各种简单数字方阵

      本文链接:https://www.haomeiwen.com/subject/wdftlktx.html