• P2239螺旋矩阵


    传送

    看到这数据范围,显然咱不能暴力直接模拟(二维数组开不下,而且会T掉)

    我们目前有两种选择:

    1.优化暴力  走这边(jyy tql%%%)

    2.数学做法

    我们看一下题目中的那个矩阵

    我们能不能找到些什么规律

    由肉眼观察得

    (1,1)=1

    (n,n)=2*n-1

    (1,n)=3*n-2

    (2,1)=4*n-4

    好像似乎有那么点规律

    所以我们不妨把当前的矩阵分成4部分

    i=1,ans=j

    j=n,ans=2*n-1-(n-i)=n-1+i(这里可以理解为从(n,n)向上的(n-i)行的数)

    i=n,ans=3*n+(j-1)=3*n-1-j(由(1,n)向右找(j-1)列)

    j=1,ans=4*n-4-(i-2)=4*n-2+i(由(2,1)向下找(i-2)行)

    如果给的i,j不在这些特殊位置呢?

    那我们就把当前的矩阵扒掉最外边的皮,此时n-2,i-1, j-1,再看当前的i,j是否在新的矩阵的特殊位置,不在就继续扒,最后肯定会找到的。因为我们扒掉了矩阵的最外边,所以每扒一层,答案要加上4*(n-1)(n为当前的n)

    这样我们就可以递归求解了

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,a,b;
    int solve(int n,int i,int j)
    {
        if(i==1)return j;
        if(j==n)return n-1+i;
        if(i==n)return 3*n-1-j;
        if(j==1)return 4*(n-1)-(i-2);//懒得化简了qwq
        return solve(n-2,i-1,j-1)+(4*n-4);
    }
    int main()
    {
        scanf("%d%d%d",&n,&a,&b);
        printf("%d",solve(n,a,b));
    }
  • 相关阅读:
    SSL 1579——泽泽在巴西
    SSL 1644——取数字问题
    SSL 1589——火车票
    SSL 1506——打鼹鼠
    SSL 1212——大厅安排
    洛谷 1064——金明的预算方案(动态规划的背包问题)
    SSL 1463——公共子串
    SSL 1461——最大连续数列的和
    SSL 1643——最小乘车费用
    SSL 1460——最小代价问题
  • 原文地址:https://www.cnblogs.com/lcez56jsy/p/11051112.html
Copyright © 2020-2023  润新知