zoukankan      html  css  js  c++  java
  • 螺旋队列问题

    看清以下数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向
    下为正。例如,7的坐标为(-1,-1),2的坐标为(0,1),3的坐标为(1,1)。编程实
    现输入任意一点坐标(x,y),输出所对应的数字。[芬兰著名软件公司2005年面试题]

    解析:规律能看出来,问题就在于如何利用它。很明显这个队列是按顺时针方向螺旋向
    外扩展的,我们可以把它看成一层一层往外延伸。第0层规定为中间的那个1,第1层为2到
    9,第2层为10到25。1、9、25……不就是平方数吗?而且是连续奇数(1、3、5……)的平
    方数。这些数还跟层数相关。推算一下就可以知道,第t层之内共有(2t-1)2个数,因而第t层会
    从[(2t-1)2]+1开始继续往外螺旋伸展。给定坐标(x,y),如何知道该点处于第几层?层
    数t=max(|x|,|y|)。
    知道了层数,接下来就好办多了,这时我们就知道所求的那点一定在第t层这个圈上,
    顺着往下数就是了。要注意的就是螺旋队列数值增长方向和坐标轴正方向并不一定相同。可
    以分成4种情况——上、下、左、右或者东、南、西、北,分别处于4条边上进行分析。
    ● 东|右:x==t,队列增长方向和Y轴一致,正东方向(y=0)数值为(2t-1)^2+t,所以v=
    (2t-1)^2+t+y。
    ● 南|下:y==t,队列增长方向和X轴相反,正南方向(x=0)数值为(2t-1)^2+3t,所以
    v=(2t-1)^2+3t-x。
    ● 西|左:x==-t,队列增长方向和Y轴相反,正西方向(y=0)数值为(2t-1)^2+5t,所以
    v=(2t-1)^2+5t-y。
    ● 北|上:y==-t,队列增长方向和X轴一致,正北方向(x=0)数值为(2t-1)^2+7t,所以
    v=(2t-1)^2+7t+x。
    其实还有一点很重要,不然会有问题。其他3条边都还好,但是在东边(右边)那条线
    上,队列增加不完全符合公式。注意到东北角(右上角)是本层的最后一个数,再往下却是
    本层的第一个数,当然不满足东线公式。所以我们把东线的判断放在最后(其实只需要放在
    北线之后就可以了),这样一来,东北角那点始终会被认为是北线上的点。
    答案:代码如下:

    -----------------------------------------------------------------------------------------------------------------------------------------------------

    如矩阵:

    找出规律,并打印出一个N×N的矩阵;规律就是从首坐标开始顺时针依次增大,代码如下:

  • 相关阅读:
    hadoop中map和reduce的数量设置问题
    Flink基础
    Leetcode中的SQL题目练习(二)
    Redis-2- 基本概念
    Redis-1-安装
    C#事件(1)
    java(13)内部类
    java(12)异常处理
    java(11)构造器
    java(10)接口抽象类
  • 原文地址:https://www.cnblogs.com/yihujiu/p/6368359.html
Copyright © 2011-2022 走看看