螺旋矩阵的探索

输出n阶螺旋矩阵中指定位置的元素值


问题描述:


问题分析:

经观察,易知螺旋矩阵由内层至外层依次递减,为以 n 2 n^2 n2为首项,以-1为公差的等差数列 。分奇数阶和偶数阶矩阵分类讨论,分别归纳得 n 2 n^2 n2所在的行和列的通项公式。 故考虑从最大值位置开始依次向目标位置移动,统计出总共移动步数(step),目标位置的值= n 2 − s t e p n^2-step n2−step ;

1)当 n n n为奇数时: n 2 n^2 n2所在的行和列分别为 ( n + 1 ) / 2 , ( n + 1 ) / 2 ; (n+1)/2 ,(n+1)/2; (n+1)/2,(n+1)/2;
2)当 n n n为偶数时, n 2 n^2 n2所在的行和列分别为 n / 2 + 1 , n / 2 n/2+1, n/2 n/2+1,n/2

由于螺旋矩阵由内往外螺距逆时针旋转逐渐递增,在矩阵中的任意一个位置上有且只有"上、下、左、右"四个方向选择如图:

偶数阶时,将右、上归为一组,左、下 归为一组;

奇数阶时,将左、下归为一组,右、上归为一组;

以组为单位进行移动,每组移动过后,step++,······直到到达目标位置为止,并计算出该位置的元素值即可。


C++实现:

cpp 复制代码
#include<iostream>
int Solve(int n,int i, int j) {
    /*
    查找螺旋矩阵中指定位置的元素的值
    算法描述:
        分奇数阶和偶数阶矩阵分类讨论,分别归纳得出n*n所在的行和列的通项公式。
        由于螺旋矩阵内层到外层依次递减,
        故考虑从最大值位置开始依次向目标位置移动,统计出总共移动步数(step),目标位置的值= n*n-step ;
    
    */
    int step = 0;
    int move = 1;
    if (n % 2 != 0) {
        //输出n*n所在的行和列
        int x = (n + 1) / 2;
        int y = (n + 1) / 2;
        //std::cout << "x=" << x << " ," << "y=" << y << std::endl;
        if (x == i && y == j) { return n * n; }
        while (true) {
            //left
            y -=move;
            step += move;            
            if (x == i && y <= j && j<=y+move) { step -= (j - y); return n * n - step; }
            //down
            x += move;
            step += move;
            if (x >=i &&i>=x-move && y == j) { step -= (x - i); return n * n - step; }
            move++;
            //right
            y += move;
            step += move;
            if (x == i && y >= j && j>=y-move) { step -= ( y-j); return n * n - step; }
            //up
            x -= move;
            step += move;
            if (x <= i &&i<=x+move && y ==j) { step -= (i-x); return n * n - step; }
            move++;
            if (x == 1 && y == n) { move--; }
        }
        std::cout << "x=" << x << " ," << "y=" << y << std::endl;
    }

    int x = n / 2 + 1;
    int y = n / 2;
    
    if (x == i && y == j) { return n * n; }
    while (true) {
        //right
        y += move;
        step += move;
        if (x == i && y >= j && j>=y-move) { step -= (y - j); return n * n - step; }
        //up
        x -= move;
        step += move;
        if (x <= i && i<=x+move && y == j) { step -= (i - x); return n * n - step; }
        move++;
        //left
        y -= move;
        step += move;
        if (x == i && y <= j && j<=y+move) { step -= (j - y); return n * n - step; }
        //down
        x += move;
        step += move;
        if (x >= i && i>=x-move && y == j) { step -= (x - i); return n * n - step; }
        move++;
        if (x == 1 && y == n) { move--; }
        std::cout << "x=" << x << " ," << "y=" << y << std::endl;
    }
        
}

int main() {
    int i = 0, j= 0,n=0;
    std::cout << "Please enter  n、i、j:" << std::endl;
    //while (true) {
        std::cin >> n >> i >> j;
        std::cout << Solve(n, i, j) << std::endl;
    //}
    system("pause");
    return 0;
}

文末,或词不达意,欢迎大家评论交流 !

相关推荐
江畔柳前堤6 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore7 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考9 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX10 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面10 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号10 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽11 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI11 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者12 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者12 小时前
【征程6】校准量化中HistogramObserver解析
算法