螺旋矩阵 题解

螺旋矩阵1

题目信息

见链接

解题思路

原本实现暴力建矩阵模拟的,结果只A了一半。

身为蒟蒻的我没法再原先的暴力上优化,只能推一推公式了。

现在我们来一起推公式!

首先,这是一个螺旋矩阵:

观察每行每列的规律可以知道:

若 是 第 1 行 , 则 第 j 列 的 数 字 是 j 若 是 第 n 列 , 则 第 i 行 的 数 字 是 n + i − 1 若 是 第 n 行 , 则 第 j 列 的 数 字 是 3 × n − 2 − j + 1 若 是 第 1 列 , 则 第 i 行 的 数 字 是 4 × n − 4 − i + 2 若是第1行,则第j列的数字是j \\ 若是第n列,则第i行的数字是n+i-1 \\ 若是第n行,则第j列的数字是3\times n-2-j+1 \\ 若是第1列,则第i行的数字是4\times n-4-i+2 1jjnin+i1nj3×n2j+11i4×n4i+2

所以(伪代码)递归函数就出来了:

FUNCTION numberAt(n, i, j) 'n*n的矩阵,第i行第j列。
    IF i = 1 THEN
        RETURN j
    END IF
    IF j = n THEN
        RETURN n + i - 1
    END IF
    IF i = n THEN
        RETURN 3 * n - 2 - j + 1
    END IF
    IF j = 1 THEN
        RETURN 4 * n - 4 - i + 2
    END IF
    RETURN numberAt(n - 2, i - 1, j - 1) + 4 * (n - 1)
END FUNCTION

整理一下,就有整个程序:

C ⁡ + + \operatorname C++ C++

#include <bits/stdc++.h>//万能头
using namespace std;
int numberAt(int n, int i, int j) {
    if (i == 1)
        return j;
    if (j == n)
        return n + i - 1;
        if (i == n)
        return 3 * n - 2 - j + 1;
    if (j == 1)
        return 4 * n - 4 - i + 2;
    //注意,递归的时候,n要减2 而不是减1,因为剥掉外面一圈后,长、宽都减小2
    return numberAt(n - 2, i - 1, j - 1) + 4 * (n - 1);
}
int main() {
    int n, i, j;
    cin >> n >> i >> j;
    cout << numberAt(n, i, j);
    return 0;
}

  1. 2013年NOIP普及组第3题 ↩︎

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值