C/C++学习笔记22:螺旋队列
2014-08-20 20:32
337 查看
先从一个面试题开始:
e.g.1看清以下数字排列的规律,设1点的坐标为(0,0),x方向向右为正,y方向向下为正。例如,7的坐标为(-1,-1),2的坐标为(1,0),3的坐标为(1,1)。编程实现输入任何一点坐标(x,y),输出所对应的数字。
如下:
![](http://img.blog.csdn.net/20140820161307001?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3piYWlzaGFiaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
分析:这是一个典型的螺旋队列。
规律:它是按照顺时针方向螺旋向外扩展的,我们可以看成是一层层的向外延伸。
第0层规定是:中间的那个1
第1层规定是:2到9的层
第3层规定是:10到25
。。。。。。。。。。
那第t层规定是:
![](http://img.blog.csdn.net/20140820162043312?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3piYWlzaGFiaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
到
![](http://img.blog.csdn.net/20140820162316276?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3piYWlzaGFiaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,总共有
![](http://img.blog.csdn.net/20140820162445687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3piYWlzaGFiaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
个数。
如何确定某个数在第几层?
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
扩展:上述是一个经常性见到的螺旋队列,那么还有这样一种螺旋队列:
e.g.2:
找出规律,并打印出一个N * N的矩阵;规律是从首坐标开始顺时针依次增大?
分析:
(1)对于一个N*N的矩阵,数的范围为1~N^2
(2)假设最外环的为第0层,则数的范围为:1~(N-1)^2
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; 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; }
扩展:上述是一个经常性见到的螺旋队列,那么还有这样一种螺旋队列:
e.g.2:
找出规律,并打印出一个N * N的矩阵;规律是从首坐标开始顺时针依次增大?
分析:
(1)对于一个N*N的矩阵,数的范围为1~N^2
(2)假设最外环的为第0层,则数的范围为:1~(N-1)^2
相关文章推荐
- 2012年8月24日--学习笔记---螺旋队列
- C++ STL--queue队列容器学习笔记
- C++ 学习笔记之 STL 队列
- 【C++学习笔记】优先级队列以及运算符重载
- C++ 学习笔记之 STL 队列
- 2012年8月24日--学习笔记---螺旋队列
- Effective C++ 学习笔记(22)
- C++学习笔记(四)指针实现的链表、堆栈、队列、二叉查找树
- Priority_Queue 优先队列 C++学习笔记
- C++学习笔记22,普通函数重载(1)
- C++ 学习笔记之 STL 队列
- C++ STL学习笔记7--priority_queue优先队列
- C++ 学习笔记之 STL 队列
- C++学习笔记22——关联容器之map
- 慕课网学习笔记之数据结构队列(C++)
- C++学习笔记22 关于多重继承 接口
- C++ STL学习笔记三 deque双端队列容器
- C++学习笔记 22
- C++ STL学习笔记三 deque双端队列容器
- c++入门学习笔记继承