洛谷P2239 螺旋矩阵 题解

Mar 14th, 2019
  • 在其它设备中阅读本文章

Summary

洛谷 P2239 螺旋矩阵 的题解,
算法为 模拟 .

Link

题目链接

Text

蒟蒻没有化简各位 dalao 凑合着用用. 一开始就想到模拟, 但是肯定超时, 后来加了判断, 如果不在那一行 / 那一列就跳过.

洛谷神机 0ms...

因为是要求那个数字的值, 相当于求从出发到那里走了多少步, 所以用一个变量来存, 而不用开数组 (数组太大)

1 2 3 4 <- 从行首到行末走了四步
2 1 2 1
1 1 1 2
3 2 1 3 <- 从列首到列尾走了三步

(搬运至新博客时注: 当时还不会用表格, 现在嘛... 咕咕咕)
(再次搬运至新博客时注: 当年都是刷的什么水题都敢发题解...)

可见走的步数是有规律的,4>3>3>2>2>1>1 第一次是 n, 第二次是 n -1, 然后每两次 -1...
然后模拟就可以了.

Code

#include <stdio.h>
int main()
{
    int a=0,b=1,n,i,j;
    long long c=0;
    scanf ("%d%d%d",&n,&j,&i);//读入 
    if (b!=j)
    {
        a+=n;
        c+=n;
    }
    else//第一行特判 
    {
        for (int x=0;x<n;x++)
        {
            a++;
            c++;
            if (a==i) break;
        }
    }
    n--;//减少移动长度 
    while ((a!=i)||(b!=j))//循环判断 
    {
        if (a!=i)//如果不在这一列就直接跳过 
        {
            b+=n;
            c+=n;//累加步数 
        }
        else//如果在就一个一个走过去 
        {
            for (int x=0;x<n;x++)
            {
                if (b==j) break;
                b++;
                c++;//累加步数 
            }
        }
        if (b!=j)//如果不在这一行就直接跳过 
        {
            a-=n;
            c+=n;//累加步数 
        }
        else//如果在就一个一个走过去 
        {
            for (int x=0;x<n;x++)
            {
                if (a==i) break;
                a--;
                c++;//累加步数 
            }
        }
        n--;//减少移动长度 
        if (a!=i)//同上[其实是因为懒 
        {
            b-=n;
            c+=n;
        }
        else
        {
            for (int x=0;x<n;x++)
            {
                if (b==j) break;
                b--;
                c++;
            }
        }
        if (b!=j)
        {
            a+=n;
            c+=n;
        }
        else
        {
            for (int x=0;x<n;x++)
            {
                if (a==i) break;
                a++;
                c++;
            }
        }
        n--;
    }
    printf ("%lld",c);//输出 
    return 0;
}

owo

mo-ha