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

0 0
原创粉丝点击