C/C++学习笔记22:螺旋队列
来源:互联网 发布:nginx 以rtmp方式点播 编辑:程序博客网 时间:2024/06/01 09:56
先从一个面试题开始:
e.g.1看清以下数字排列的规律,设1点的坐标为(0,0),x方向向右为正,y方向向下为正。例如,7的坐标为(-1,-1),2的坐标为(1,0),3的坐标为(1,1)。编程实现输入任何一点坐标(x,y),输出所对应的数字。
如下:
分析:这是一个典型的螺旋队列。
规律:它是按照顺时针方向螺旋向外扩展的,我们可以看成是一层层的向外延伸。
第0层规定是:中间的那个1
第1层规定是:2到9的层
第3层规定是:10到25
。。。。。。。。。。
那第t层规定是:到,总共有个数。
如何确定某个数在第几层?
t=max(|x|,|y|)
首先通过输入的x,y可以知道在第几层,然后知道了第几层就可以知道了这个数的取值范围。
然后根据以下几种情况就可以知道到底是第几个数,就是如何数得想要的数?
(1)x==t,队列增长方向与y一致,所以y=0方向上的值是:(2t-1)^2+t,所以v的值为:(2t-1)^2+t+y;
(2)y==t,队列增长方向与x相反,所以x=0方向上的值是:(2t-1)^2+3t,所以v的值为:(2t-1)^2+3t-x
(3)x==-t,队列增长方向与y相反,所以y=0方向上的值是:(2t-1)^2+5t,所以v的值为:(2t-1)^2+5t-y
(4)y==-t,队列增长方向与x一致,所以x=0方向上的值是:(2t-1)^2+7t,所以v的值为:(2t-1)^2+7t-y
#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;elsev+=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;}
扩展:上述是一个经常性见到的螺旋队列,那么还有这样一种螺旋队列:
e.g.2:
找出规律,并打印出一个N * N的矩阵;规律是从首坐标开始顺时针依次增大?
分析:
(1)对于一个N*N的矩阵,数的范围为1~N^2
(2)假设最外环的为第0层,则数的范围为:1~(N-1)^2
- C/C++学习笔记22:螺旋队列
- c++ 螺旋数字队列
- c语言写螺旋队列并分析
- 螺旋队列问题之c语言
- 《C和指针》学习笔记之队列
- C语言之队列学习笔记
- 2012年8月24日--学习笔记---螺旋队列
- [C]螺旋矩形算法
- c 螺旋方阵 【原创】
- [C++] 螺旋矩阵
- 螺旋矩阵(c实现)
- C++/C学习笔记
- linux c学习笔记——消息队列
- 学习笔记------数据结构(C语言版)队列链式存储
- 慕课网学习笔记之数据结构队列(C++)
- 螺旋矩阵的C实现
- 螺旋矩阵C语言实现
- C语言输出螺旋矩阵
- canvas块状擦除,擦掉上面图片,漏出下面
- hdu 4961 Boring Sum
- mac 显示桌面快捷键
- UVA 282 - Rename(字符串处理)
- CopyOnWriteArrayList
- C/C++学习笔记22:螺旋队列
- js组件写法技巧
- Java注解Annotation详解
- 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
- 计算复活节日期的算法年份
- 2014多校联合第9场1002||hdu 4691 质因子
- MySQL数据库中的日志文件---(1)错误日志
- js中利用正则表达式实现空格与换行的互相转换
- Hadoop构建MapRedcue程序的基础模板