`
mars914
  • 浏览: 430164 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

螺旋队列算法设计

阅读更多

21    22    23    24     25
20    7      8       9     10
19    6      1       2     11
18    5      4       3     12
17    16    15    14     13

        看清以上数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正.例如:7的坐标为(-1,-1) ,2的坐标为(0,1),3的坐标为(1,1).编程实现输入任意一点坐标(x,y),输出所对应的数字。


        解析:规律能看出来,问题就在于如何利用它。很明显这个队列是顺时针螺旋向外扩展的,我们可以把它看成一层一层往外延 伸。第 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 层这个圈上,顺着往下数就是了。要注意的就是螺旋队列数值增长方向和坐标轴正方向并不一定相同。我们可以分成四种情况——上、下、左、右——或者——东、南、西、北,分别处于四条边上来分析。


  东|右: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


  其实还有一点很重要,不然会有问题。其它三条边都还好,但是在东边(右边)那条线上,队列增加不完全符合公式!注意 到东北角(右上角)是本层的最后一个数,再往下却是本层的第一个数,那当然不满足东线公式啊。所以我们把东线的判断放在最后(其实只需要放在北线之后就可 以),这样一来,东北角那点始终会被认为是北线上的点。

 

答案:代码如下:

#include <stdio.h>
#define max(a,b) ((a)<(b)?(b):(a))
#define abs(a) ((a)>0?(a):-(a))
int foo(int x, int y)
{
    int t = max(abs(x), abs(y));
    int u = t + t;
    int v = u - 1;
    v = v * v + u;
    if (x == - t)
        v += u + t - y;
    else if (y == - t)
        v += 3 * u + x - t;
    else if (y == t)
        v += t - x;
    else
        v += y - t;
    return v;
}

int main()
{
    int x, y;
    for (y = - 4; y <= 4; y++)
    {
        for (x = - 4; x <= 4; x++)
            printf("%5d", foo(x, y));
            printf("\n");
    }
    while (scanf("%d%d", &x, &y) == 2)
        printf("%d\n", foo(x, y));
    return 0;
}

 

分享到:
评论

相关推荐

    【Linux】关于螺旋队列算法的精讲

    本文主要对螺旋队列算法图文结合的进行了讲解。

    螺旋阵列_C++_算法

    螺旋阵列,输入坐标,显示阵列对应数 螺旋矩阵

    JavaScript版 数据结构与算法

    2-3 反转单词代码演示 2-4 计算子串原理讲解 试看 2-5 计算子串代码演示第3章 基础算法之“数组类”数组是JS世界里必不可少的类型,“小小”的数组,“大大”的世界,一维、二维空间、组合、分组、堆栈、队列等等都...

    史上最全经典数据结构算法c语言实现代码合集

    N皇后问题回溯算法.txt ping.txt re.txt source.txt winsock2.txt ww.txt 万年历.txt 万年历的算法 .txt 乘方函数桃子猴.txt 乘法矩阵.txt 二分查找1.txt 二分查找2.txt 二叉排序树.txt 二叉树.txt ...

    经典数据结构算法c语言实现代码(大全)

    N皇后问题回溯算法.txt ping.txt re.txt source.txt winsock2.txt ww.txt 万年历.txt 万年历的算法 .txt 乘方函数桃子猴.txt 乘法矩阵.txt 二分查找1.txt 二分查找2.txt 二叉排序树.txt 二叉树.txt ...

    高速数字振动信号无线接收螺旋缓冲算法

    为保证接收数据的完整性和实时性,提出一种螺旋缓冲区域模型,该模型构造出一个环状队列,可以临时性地存储一定量的数据,这些数据在环形队列中时,就可以随时对数据进行操控。经过球磨机筒体振动信号采集和传输装置...

    数据结构及算法C语言实现代码集[推荐下载]

    效验算法 数学问题 数据结构 数组 文件程序 求进制 汉诺塔 硬币情况 逆阵 链串.c 链栈.c 链队列.c 问题算法 顺序栈.c 顺序表.c 顺序队列.c ./其它&#58; c语言窗体实例.zip 傻瓜递归.c 冒泡法改进.c 小字库DIY-.c 小...

    2005-2009软件设计师历年真题

     • 算法与数据结构的关系、算法效率、算法设计、算法描述(流程图、伪代码、决策表)、算法的复杂性  2.计算机系统知识  2.1 硬件知识  2.1.1 计算机系统的组成、体系结构分类及特性  • CPU和存储器的组成、...

    C语言常用算法

    073 队列实例 074 K阶斐波那契序列 第三部分 数值计算与趣味数学篇 075 绘制余弦曲线和直线的迭加 076 计算高次方数的尾数 077 打鱼还是晒网 078 怎样存钱以获取最大利息 079 阿姆斯特朗数 080 亲密数 ...

    leetcode会员怎么买便宜-leetcode:javascript数据结构和算法

    设计循环队列 任务调度器 链表 排序链表 环形链表 矩阵 螺旋矩阵 旋转图像 二叉树 对称二叉树 验证二叉树 进阶算法 贪心算法 买卖股票的最佳时机 柠檬水找零 动态规划 不同路径 k站中转内最便宜的航班 基础算法之...

    迷宫问题:m×n长方阵表示迷宫

    设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 实现要求: ⑴ 实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式...

    扩展矩阵leetcode-DsAlgo:数据结构和算法实践

    矩阵的螺旋顺序 在数组中实现 K 个堆栈 查找数组中缺失的数字 在排序数组中搜索,列表继续。 链表 像数组一样,链表也是一种线性数据结构,只是它的元素不存储在连续的位置。 以下是我尝试过的一些问题,并针对 ...

    JavaScript-Algorithms:JavaScript算法

    JavaScript算法 JavaScript算法 内容 -&gt;不使用内置数组方法的字符串反转 -&gt;回文检查 -&gt;查找数组中的最大连续1 -&gt;查找字符串中的最大重复字符 -&gt; FizzBu​​zz -&gt;将数组划分为给定长度的块 ...-&gt;与堆栈队列

    javalruleetcode-Algorithm:永无止境的LeetcodeQ

    java lru leetcode 算法 永无止境的 Leetcode Q 解决方案在 C++17 和 Java 中可用 Leetcode 问题描述 # 算法 下一个排列 单程方法 LRU缓存 队列 ...螺旋矩阵 ...队列 ...队列 设计循环队列 大批 斐波那契数 自

    leetcode分类-leetcode-cn-js:前端数据结构和算法系统练习,字节跳动企业题库

    54.螺旋矩阵 55.跳跃游戏 71.简化路径 75.颜色分类 82.删除排序链表中的重复元素 92.反转链表 II 94.二叉树的中序遍历 98.验证二叉搜索树 102.二叉树的层序遍历 121.买卖股票的最佳时机 144.二叉树的前序和后续遍

    leetcode跳跃-leetcode:LeetCode题记,Java语言

    螺旋数组 088 283 867 ★☆☆ 栈-队列 相关代码 # Title 020 071 094 155 包含 min 函数的栈 224 简单的计算器 225 使用队列实现栈 232 使用栈实现队列 946 合法的出栈序列 堆 相关代码 # Title 215 数组中第 k 大的...

    lrucacheleetcode-PrePlacePrep:GeeksforGeeks和LeetCode重要的编码问题

    堆栈和队列 树和 BST 堆 递归 散列 图形 贪婪的 动态规划 分而治之 回溯 位魔法 数组: 给定总和的子数组 数三胞胎 Kadane 算法 数组中缺少数字 合并两个已排序的数组 交替重新排列数组 对数 数组的反转 对 0、1 和 ...

    C程序范例宝典(基础代码详解)

    实例172 打印n阶螺旋方阵 247 5.5 生活中的数学 249 实例173 求车运行速度 249 实例174 卖西瓜 250 实例175 打渔晒网问题 251 实例176 水池注水问题 252 实例177 捕鱼和分鱼问题 253 实例178 递归解...

    C语言通用范例开发金典.part2.rar

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

Global site tag (gtag.js) - Google Analytics