楼主: newkid

[每日一题] PUZZLEUP 2015

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
301#
 楼主| 发表于 2015-10-17 03:54 | 只看该作者
  1. EXEC :N:=9;

  2. WITH
  3. d AS (
  4. SELECT (:N+3)/4-ABS((:N-1)/4 - LEAST(r-1,:N-r,c-1,:N-c)) d,r,c
  5.   FROM (SELECT CEIL(LEVEL/:N) r,MOD(LEVEL-1,:N)+1 c FROM DUAL CONNECT BY LEVEL<=:N*:N)
  6. )
  7. ,t(r,c,d,lvl) AS (
  8. SELECT r,c,d,1
  9.   FROM d
  10. WHERE d=1
  11. UNION ALL
  12. SELECT d.r,d.c,d.d,t.lvl+1
  13.   FROM t,d
  14. WHERE lvl<(:N+1)/2
  15.        AND d.d=(:N+3)/4-ABS((:N-1)/4 - t.lvl)
  16.        AND ABS(t.r-d.r) IN (0,1) AND ABS(t.c-d.c) IN (0,1)
  17. )
  18. SELECT COUNT(*) FROM t WHERE lvl=(:N+1)/2;
复制代码


使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
302#
 楼主| 发表于 2015-10-17 03:56 | 只看该作者
通过“代码”标签,终于可以把SQL发出来了。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
303#
发表于 2015-10-17 09:33 | 只看该作者
newkid 发表于 2015-10-17 03:54

这个公式总结得好简练

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
304#
发表于 2015-10-17 09:39 | 只看该作者
用代码,复制到剪贴板没有换行了

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
305#
发表于 2015-10-17 12:26 | 只看该作者
〇〇 发表于 2015-10-17 09:39
用代码,复制到剪贴板没有换行了

不要复制到 notepad, 复制到 Utraedit 或 notepad++ 这样的编辑器,是认换行的,格式OK

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
306#
发表于 2015-10-17 17:35 | 只看该作者
solomon_007 发表于 2015-10-17 12:26
不要复制到 notepad, 复制到 Utraedit 或 notepad++ 这样的编辑器,是认换行的,格式OK

我直接复制到cmd的sqlplus,只好用写字板中转了

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
307#
发表于 2015-10-18 11:22 | 只看该作者
〇〇 发表于 2015-10-17 09:33
这个公式总结得好简练

我今天细细研究了一下 newkid 的写法, 总结的精简公式:
(:N+3)/4-ABS((:N-1)/4 - LEAST(r-1,:N-r,c-1,:N-c))


数字方阵中,根据坐标 (rowno,colno) 可以确定所在的环: least(rowno-1,&N-rowno,colno-1,&N-colno)+1
              再根据环确定这个坐标位置的值,以N=9为例:
                 
                  环: 1,2,3,4,5
                  值: 1,2,3,2,1
                  
              我到了这里,就在SQL中直接用 CASE WHEN 的语句表达了,如下:
              
              select rowno,colno,
                   case when circle <= ((&N+1)/2 + 1)/2 then circle  
                        else (&N+1)/2 +1 - circle
                   end as val
              from t2;
              
              对于N,环的最大值为(&N+1)/2 + 1)/2, 在到达这个值之前,环与值相等,只后是环与值的差递减,用绝对值表达就是:   
              
                  ((&N+1)/2 + 1)/2 - abs( ((&N+1)/2 + 1)/2 - (least(rowno-1,&N-rowno,colno-1,&N-colno)+1) )
                  
              把这个再化简一下,就是 newkid 的公式了:
              (:N+3)/4-ABS((:N-1)/4 - LEAST(r-1,:N-r,c-1,:N-c))




   

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
308#
发表于 2015-10-18 11:49 | 只看该作者
有了上面的公式, 递归语句中的 AND d.d=(:N+3)/4-ABS((:N-1)/4 - t.lvl) 这个条件就好理解了,
有等于1的最外圈开始,连接到最内圈 (:N+1)/2, 值就自然是 12321(N=9)这个样子的了. 而我没次
都是用下面这个方式,把周围的8个点都硬生生地拉进来:

   s  as (select -1 rno, -1 lno from dual
            union all
           select -1,0 from dual
            union all
           select -1,1 from dual
            union all
           select 0,-1 from dual
            union all
           select 0,1  from dual
            union all
           select 1,-1 from dual
            union all
           select 1,0  from dual
            union all
           select 1,1  from dual)

所以我的才冗长而低效...

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
309#
发表于 2015-10-18 13:26 | 只看该作者
solomon_007 发表于 2015-10-18 11:49
有了上面的公式, 递归语句中的 AND d.d=(:N+3)/4-ABS((:N-1)/4 - t.lvl) 这个条件就好理解了,
有等于1的 ...

也可以往回返到起点

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
310#
发表于 2015-10-18 13:26 | 只看该作者
solomon_007 发表于 2015-10-18 11:22
我今天细细研究了一下 newkid 的写法, 总结的精简公式:
(:N+3)/4-ABS((:N-1)/4 - LEAST(r-1,:N-r,c-1, ...

看来数学好才能编程好

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表