螺旋队列算法详解.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
螺旋队列算法详解 /* 螺旋队列 ??设1的坐标是(0,0),的方向向右为正,y方向向下为正, 例如,7的坐标为(-1,-1),2的坐标为(0,1)。 ??编程实现输入任意一点坐标(x,y),输出所对应的数字。 ???? 43 44 45 46 47 48 49 ???? 42 21 22 23 24 25 26 ???? 41 20?? 7?? 8?? 9 10 27 ???? 40 19?? 6?? 1?? 2 11 28?? ???? 39 18?? 5?? 4?? 3 12 29? ???? 38 17 16 15 14 13 30 ???? 37 36 35 34 33 32 31 ? 算法:by smilelance (绝对独家,超级详细,如果你看完这个还不懂,我就无语了~~~) 1、从1开始向外扩散,任意数字所在层应为:t = max(|x|,|y|)。比如5,9在第一层 2、右上角斜线数字为:ur = (2t+1)*(2t+1) 左下角斜线数字为:dl = 2t*2t+1 3、每一圈数字分为四个区域:比如25所在的第二层: 21,22,23,24,25? A区,y == -t ???? 17,18,19,20,??B区,x == -t? 除掉A区数字 13,14,15,16,??C区,y == t?? 除掉AB区数字 10,11,12????D区,x == t?? 除掉ABC区数字 4、每一圈数字总数都是8t,右上角数字最大, 减去若干个t就得到四个边的数字, 这就是通过右上角数字取圈内任意数字的关键算法了 */ #define abs(a)??? ((a)0?(a):(-a)) #define max(a,b)? ((a)(b)?(a):(b)) void print_helix_number(int n){ ??? int x, y; ??? for(y=-n;y=n;y++) { ??????? for(x=-n;x=n;x++){ ??????????? printf(%5d,lookupHelixNumber(x,y)); //n 5以上数字就不对齐拉,嘿嘿 ??????? } ????? printf(/n); ??? } } ? int lookupHelixNumber(int x, int y){ ?int t = max(abs(x), abs(y)); ?int?ur = (2*t+1)*(2*t+1); ?int n = 1; ? if ( y == -t) ??? n = ur-t+x; ? else if (x == -t) ??? n = ur-3*t-y;????//3t, 5t啥的是规律,观察一圈数字就知道拉 ? else if (y == t) ??? n = ur-5*t-x; ? else ??? n = ur-7*t+y; ??? ? return n; }

文档评论(0)

fangqing12 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档