螺旋队列

来源:互联网 发布:手机淘宝10.0 编辑:程序博客网 时间:2024/06/10 02:49

作者:hustwing         hustwing@126.com  MSN: hustwing@hotmail.com

我最先在《程序员面试宝典》上看到的一个题目:

【题目】
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的坐标为(1,0),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字。

【题目完】

这道题第一次拿到手时,还着实花了我一些时间来思考。如果这算是一次面试,那我还真是有些失败。

我自己想到的一个实现是,先计算出每个正方形(以1为中心,可以将数字看做是一圈一圈的正方形),先算出每个正方形的右上角的顶点数字(1,9,25),这些数实际上是((2n+1)^2),再根据这些数字的坐标来推算这一圈上的其它数字的坐标。前几天网上搜了一下,发现还不只我一个人这么想,别人已经实现了我的想法,我也只把别人的稍稍消化一下,就直接"拿来主义"了。一向喜欢简洁易懂的代码,下面的代码,只要画个图简单地分析一下就明白了,呵呵,很好很强大。

----------------------------------------------------------------------------------------------------------------------------------------

#define max(a,b) ((a)<(b)?(b):(a))
#define abs(a) ((a) > 0 ?(a):-(a))
int foo(int x,int y)
{
    if (0==x && 0==y)
    {
        return 1;
    }
    int t = max(abs(x),abs(y));
    int u = (2*t + 1)*(2*t +1);
    //依次考察正方形的每条边线
    if (y == -t)
    {
        u -= t - x;
    }
    else if (x == -t)
    {
        u -= (t + y + 2*t);
    }
    else if (y == t)
    {
        u -= (t + x + 4*t);
    }
    else
    {
        u -= (t - y + 6*t);
    }
    return u;
}

#define N 3
int _tmain(int argc, _TCHAR* argv[])
{
    int x, y;
    for (y=-N; y<=N; y++)
    {
        for (x=-N; x<=N; x++)
        {
            printf("%4d", foo(x, y));
        }
    printf(" /n");
    }
    return 0;
}

--------------------------------------------------------完整代码,包括验证代码--------------------------------------------------------------

最后,参考网址给出来:http://www.diybl.com/course/3_program/c++/cppjs/2008219/100341.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信显示存储卡已拔出怎么办 储存卡已拔出微信头像不可用怎么办 智能手机的电话卡取不出来了怎么办 换了苹果手机通讯录没了怎么办 手机玻璃膜一角翘起来了怎么办 华为畅玩7x耗电快怎么办 魅蓝5s充电器死机了怎么办 苹果手机乐动力不计步数怎么办 意大利居留按手印时间过了怎么办 酷派t1手机解析包出现问题怎么办 p新买的手机壳有味怎么办 门锁钥匙口竖着钥匙放不进去怎么办 摩拜单车被别人骑走了怎么办 捡到苹果8p手机怎么办才能自己用 用力按压导致玻尿酸变形移位怎么办 华为麦芒5应用锁密码忘了怎么办 华为麦芒6应用锁密码忘了怎么办 华为手机的设置不在桌面了怎么办 华为手机所有应用都不在桌面怎么办 华为麦芒5设置页面不显示怎么办 华为麦芒5主屏页面不显示怎么办 6s p换屏幕原装太贵怎么办 4g手机开不开机黑屏怎么办 华为麦芒5 4g信号差怎么办 华为麦芒手机锁屏密码忘了怎么办 华为麦芒5相机拍相片倒了怎么办 红米5a开不了机怎么办 华为沾了海水打不开机怎么办 华为麦芒手机忘记锁屏密码怎么办 华为手机的方框键摁不了怎么办 笔记本自动更新到一半太慢了怎么办 华为麦芒5音量下键乱跑了怎么办 麦芒6手机QQ视频没声音怎么办 18:9看16:9黑边怎么办 华为畅享7s声音小怎么办 华为畅享8手机声音小怎么办 华为畅享8plus声音小怎么办 荣耀7x锁屏密码忘记怎么办 华为荣耀7x锁屏密码忘记了怎么办 苹果耳机进水后声音变了怎么办 华为荣耀开了数据用不了怎么办