螺旋队列算法分析

转自:http://blog.csdn.net/yhmhappy2006/article/details/2934435

最近要准备笔试和面试,所以看了一下《程序员面试宝典》这本书,看到一个面试题,要写螺旋队列,以前都没听过,我花几分种时间想了想,没找出其中的规律,看了一下答案是直接给出了公式,但没说是如何分析的,所以在网上查了查,发现这篇文章分析的很详细,就转过来了

下面的数据排列就是螺旋队列

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),输出所对应的数字。

其实这里题目有个错误的地方,刚开始,我也困惑了好一会,导致一直理解不过来,其实2的坐标应该是(1,0),这样才符合分析的公式,代码如下:

 

#include <iostream>
#include <string>
using namespace std;

#define abs(a)    ((a)>0?(a):(-a))
#define max(a,b) ((a)>(b)?(a):(b))

int spiralval(int x,int y)
{
	int t = max(abs(x),abs(y));
	int vc = (t*2+1)*(t*2+1);
	int u;
	if ( y == -t) //分别判断,点落在该圈4条边的哪条边上
		u = vc+(x+y);
	else if (x == -t)
		u = vc+(3*x-y);
	else if (y == t)
		u = vc + (-x - 5*y);
	else
		u = vc+(-7*x+y);
	return u;
}
int main()
{
	int x,y;
	for(y=-5;y<=5;y++)
	{
		for(x=-5;x<=5;x++)
			printf("%5d",spiralval(x,y));

		printf("\n");
	}
    cout << endl;
	cout<<"input x value:";
	cin>>x;
	cout<<"input y value:";
	cin>>y;
	cout<<"the result is "<<spiralval(x,y);
	return 0;
}

注意,一定要先判断y==-t,因为当在右上的对角线上的数字,满足两种公式要求,一种y==-t,一种x==t,但只有y==-t这种公式算出来的对角数字才是对的

参考资料:

1.http://blog.csdn.net/yhmhappy2006/article/details/2934435

2.http://hi.baidu.com/%D3%C0%BA%E3%D0%C4%B0%AE/blog/item/0a182724c5816f0b4c088d28.html

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值