楼主: newkid

[精华] puzzleup2012谜题,请用SQL或PLSQL解答

[复制链接]
论坛徽章:
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
31#
 楼主| 发表于 2012-8-2 00:17 | 只看该作者
本帖最后由 newkid 于 2012-8-2 00:28 编辑

很不雅的暴力法,只能算到N=5, 看看能否找出规律再推广:

VAR N NUMBER;
EXEC :N:=4;

WITH g AS (
SELECT LEVEL-1 n
      ,TRUNC((LEVEL-1)/:N) r
      ,MOD(LEVEL-1,:N) c
      ,POWER(2,LEVEL-1) bit
  FROM DUAL CONNECT BY LEVEL<=:N*:N
)
,t(lvl,bits,path,diag,diag2,r,c)  AS (
SELECT 1,g.bit,CAST(r||'-'||c AS VARCHAR2(1000)),CASE WHEN r=c THEN 1 ELSE 0 END,CASE WHEN r+c=:N-1 THEN 1 ELSE 0 END,r,c
  FROM g
WHERE r<=TRUNC((:N-1)/2) AND c<=TRUNC((:N-1)/2)
       AND c>=r
UNION ALL
SELECT t.lvl+1
      ,t.bits+g.bit
      ,t.path||','||g.r||'-'||g.c
      ,t.diag + CASE WHEN g.r=g.c THEN lvl+1 ELSE 0 END
      ,t.diag2 + CASE WHEN g.r+g.c=:N-1 THEN lvl+1 ELSE 0 END
      ,g.r,g.c
  FROM t,g
WHERE BITAND(t.bits,g.bit)=0
       AND (t.r,t.c) IN ((g.r+1,g.c),(g.r-1,g.c),(g.r,g.c+1),(g.r,g.c-1))
)
SELECT GREATEST(diag,diag2),path FROM (
SELECT * FROM t WHERE lvl=:N*:N ORDER BY GREATEST(diag,diag2) DESC
)
WHERE ROWNUM=1
;


GREATEST(DIAG,DIAG2)
--------------------
PATH
---------------------------------------------------------------------
                  48
0-0,0-1,1-1,1-0,2-0,3-0,3-1,3-2,3-3,2-3,1-3,0-3,0-2,1-2,2-2,2-1


Elapsed: 00:00:00.13


SQL> EXEC :N:=5;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00
SQL> /

GREATEST(DIAG,DIAG2)
--------------------
PATH
-----------------------------------------------------------------------------------------------------------
                  97
0-0,0-1,0-2,1-2,1-1,1-0,2-0,3-0,4-0,4-1,4-2,3-2,3-3,4-3,4-4,3-4,2-4,1-4,0-4,0-3,1-3,2-3,2-2,2-1,3-1


Elapsed: 00:00:49.17

使用道具 举报

回复
论坛徽章:
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
32#
发表于 2012-8-2 06:50 | 只看该作者
newkid 发表于 2012-8-1 23:11
#2 Diagonal Sum

Place the numbers 1 through 100 on a 10x10 square table so that all consecutive n ...

812
793
654这种放法合规?

使用道具 举报

回复
论坛徽章:
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
33#
 楼主| 发表于 2012-8-2 08:01 | 只看该作者
〇〇 发表于 2012-8-2 06:50
812
793
654这种放法合规?

不行,不能走对角。
我观察的公式 SELECT POWER(:N,3)-:N*:N*2+3*:N-2 + (:N-2)*3 FROM DUAL;
就是说从N^2开始,连续N-1个最大数(递减2因为不能走对角)可以放在对角线上,剩下一个是 (N-2)*3
适用于3,4,5, 但是6无法验证。

使用道具 举报

回复
论坛徽章:
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
34#
发表于 2012-8-2 10:33 | 只看该作者
newkid 发表于 2012-8-2 00:17
很不雅的暴力法,只能算到N=5, 看看能否找出规律再推广:

VAR N NUMBER;

看了下路径好像是贴边走争取把最大的放偏右上角

使用道具 举报

回复
论坛徽章:
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
35#
发表于 2012-8-2 10:55 | 只看该作者
newkid 发表于 2012-8-2 08:01
不行,不能走对角。
我观察的公式 SELECT POWER(:N,3)-:N*:N*2+3*:N-2 + (:N-2)*3 FROM DUAL;
就是说从 ...

2*2:2,4
3*3:{3},7,9
4*4:12,14,16,{6}
5*5:19,21,23,25,{9}

使用道具 举报

回复
论坛徽章:
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
36#
发表于 2012-8-2 11:25 | 只看该作者
〇〇 发表于 2012-8-2 10:55
2*2:2,4
3*3:{3},7,9
4*4:12,14,16,{6}


6*6

使用道具 举报

回复
论坛徽章:
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
37#
发表于 2012-8-2 11:26 | 只看该作者
newkid 发表于 2012-8-2 08:01
不行,不能走对角。
我观察的公式 SELECT POWER(:N,3)-:N*:N*2+3*:N-2 + (:N-2)*3 FROM DUAL;
就是说从 ...

6也可以最后n-1个最大值,但多余的比(n-2)*3大

使用道具 举报

回复
论坛徽章:
93
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
38#
发表于 2012-8-2 11:46 | 只看该作者
本帖最后由 udfrog 于 2012-8-2 19:38 编辑
newkid 发表于 2012-8-1 23:11
#2 Diagonal Sum

Place the numbers 1 through 100 on a 10x10 square table so that all consecutive n ...
  1. with t as (
  2. select        c, r
  3. from        (select rownum c from dual connect by rownum<=10),
  4.         (select rownum r from dual connect by rownum<=10)
  5. ),
  6. tmp as (
  7. select        level lv, sys_connect_by_path(decode(c, 11-r, level, 0), '+') rst
  8. from        t
  9. start with greatest(c, r)<=5
  10. connect by nocycle (prior c=c and (prior r=r+1 or prior r+1=r)) or (prior r=r and (prior c=c+1 or prior c+1=c)))
  11. select        max(dbms_aw.eval_number('0'||rst))
  12. from tmp
  13. where        lv=100
  14. /
复制代码

使用道具 举报

回复
论坛徽章:
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
39#
发表于 2012-8-2 12:15 | 只看该作者
udfrog 发表于 2012-8-2 11:46

出不来啊

with t as (
*
第 1 行出现错误:
ORA-01013: 用户请求取消当前的操作


已用时间:  00: 06: 03.98

使用道具 举报

回复
论坛徽章:
1
ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
40#
发表于 2012-8-2 12:25 | 只看该作者
870

使用道具 举报

回复

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

本版积分规则 发表回复

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