楼主: newkid

PUZZLEUP 2014

[复制链接]
论坛徽章:
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
351#
 楼主| 发表于 2014-10-31 02:08 | 只看该作者
lastwinner 发表于 2014-10-31 00:33
没看错,我就是想知道策略如何设计,但又不想去看之前你给出的sql结果——因为里面不容易看出策略

这个X=21的理想树形是设计不出来的,我已经证明了。既然不可能,就无所谓什么策略。
X=20形状不是这样。我是用代码弄出来的,去掉了上面的推论1(即允许回头),这样就构造出来了。

使用道具 举报

回复
论坛徽章:
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
352#
 楼主| 发表于 2014-10-31 02:20 | 只看该作者
lastwinner 发表于 2014-10-31 00:32
这种机械的活儿做起来太累了啊

如果旋转、翻转后重合的形状只能算一种:

WITH t AS (SELECT LEVEL N FROM DUAL CONNECT BY LEVEL<=5)
,t2 AS (
SELECT S,SUBSTR(S,N)||SUBSTR(S,1,N-1) S2
   FROM (SELECT REPLACE(SYS_CONNECT_BY_PATH(N,','),',') S  FROM t
          WHERE LEVEL=5
          CONNECT BY NOCYCLE PRIOR N<>N
        ),t
)
SELECT DISTINCT MIN(s2)
  FROM (SELECT s,s2 FROM t2 UNION ALL SELECT s,REVERSE(s2) FROM t2)
GROUP BY s
;

14325
12543
13524
13245
14235
12534
13254
12345
12453
12435
13425
12354

12 rows selected.

使用道具 举报

回复
论坛徽章:
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
353#
发表于 2014-10-31 07:41 | 只看该作者
newkid 发表于 2014-10-31 02:20
如果旋转、翻转后重合的形状只能算一种:

WITH t AS (SELECT LEVEL N FROM DUAL CONNECT BY LEVEL

高级

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
354#
发表于 2014-10-31 17:34 | 只看该作者
使用了 newkid 的思路改写, 不能算其他方法。

WITH T AS (
SELECT REPLACE(SYS_CONNECT_BY_PATH(N,','),',','') S
FROM (SELECT LEVEL N FROM DUAL CONNECT BY LEVEL <= 5 )
WHERE LEVEL = 5
CONNECT BY NOCYCLE LEVEL <= 5 AND N <> PRIOR N
)

SELECT DISTINCT S1 FROM T
MODEL
DIMENSION BY (S)
MEASURES (S AS S1)
RULES (
  S1[S] = S1[REVERSE(CV())]
);

使用道具 举报

回复
论坛徽章:
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
355#
发表于 2014-10-31 17:43 | 只看该作者
newkid 发表于 2014-10-31 02:20
如果旋转、翻转后重合的形状只能算一种:

WITH t AS (SELECT LEVEL N FROM DUAL CONNECT BY LEVEL

每个结果都是1开头,能否去掉

使用道具 举报

回复
论坛徽章:
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
356#
 楼主| 发表于 2014-10-31 22:00 | 只看该作者
〇〇 发表于 2014-10-31 17:43
每个结果都是1开头,能否去掉

你什么意思?
从哪个点出发都一样,都是等价的。我用了LEAST所以全部从1点出发。有什么不对?

使用道具 举报

回复
论坛徽章:
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
357#
 楼主| 发表于 2014-11-1 02:19 | 只看该作者
野花要的X=20的分配策略,原来竟是如此简单!

平均分成五组,每组四个点。
取第一组,从点1开始。令点1指向第二组所有的点,点2指向第三组所有的点,...四个组刚好分配给四个点。
对其他组做同样的分配动作。

WITH p AS
(SELECT LEVEL p,CEIL(LEVEL/4) g,ROW_NUMBER() OVER(PARTITION BY CEIL(LEVEL/4) ORDER BY LEVEL) rn
   FROM DUAL
CONNECT BY LEVEL<=20)
,g AS (
       SELECT p from_p,to_p
         FROM (
       SELECT p1.*,p2.p to_p,DENSE_RANK() OVER(PARTITION BY p1.g ORDER BY p2.g) rnk
         FROM p p1,p p2
        WHERE p1.g<>p2.g
              )
       WHERE rn=rnk
) ----- 至此分配完毕
SELECT from_p,COUNT(DISTINCT to_p) FROM (
SELECT g1.from_p
      ,g2.to_p
  FROM g g1, g g2
WHERE g1.to_p=g2.from_p
UNION ALL
SELECT * FROM g
)
GROUP BY from_p;

    FROM_P COUNT(DISTINCTTO_P)
---------- -------------------
         1                  20
         2                  20
         3                  20
         4                  20
         5                  20
         6                  20
         7                  20
         8                  20
         9                  20
        10                  20
        11                  20
        12                  20
        13                  20
        14                  20
        15                  20
        16                  20
        17                  20
        18                  20
        19                  20
        20                  20

20 rows selected.
        

WITH p AS
(SELECT LEVEL p,CEIL(LEVEL/4) g,ROW_NUMBER() OVER(PARTITION BY CEIL(LEVEL/4) ORDER BY LEVEL) rn
   FROM DUAL
CONNECT BY LEVEL<=20)
,g AS (
       SELECT p from_p,to_p
         FROM (
       SELECT p1.*,p2.p to_p,DENSE_RANK() OVER(PARTITION BY p1.g ORDER BY p2.g) rnk
         FROM p p1,p p2
        WHERE p1.g<>p2.g
              )
       WHERE rn=rnk
) ----- 至此分配完毕      
SELECT from_p,SUM(in_cnt),SUM(out_cnt)
  FROM (
SELECT from_p,0 in_cnt,COUNT(*) out_cnt FROM g GROUP BY from_p
UNION ALL
SELECT to_p,COUNT(*),0 FROM g GROUP BY to_p
)
GROUP BY from_p
ORDER BY 1;

    FROM_P SUM(IN_CNT) SUM(OUT_CNT)
---------- ----------- ------------
         1           4            4
         2           4            4
         3           4            4
         4           4            4
         5           4            4
         6           4            4
         7           4            4
         8           4            4
         9           4            4
        10           4            4
        11           4            4
        12           4            4
        13           4            4
        14           4            4
        15           4            4
        16           4            4
        17           4            4
        18           4            4
        19           4            4
        20           4            4

20 rows selected.

使用道具 举报

回复
论坛徽章:
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
358#
 楼主| 发表于 2014-11-1 02:22 | 只看该作者
上面是校验,分配结果简单得很:

WITH p AS
(SELECT LEVEL p,CEIL(LEVEL/4) g,ROW_NUMBER() OVER(PARTITION BY CEIL(LEVEL/4) ORDER BY LEVEL) rn
   FROM DUAL
CONNECT BY LEVEL<=20)
,g AS (
       SELECT p from_p,to_p
         FROM (
       SELECT p1.*,p2.p to_p,DENSE_RANK() OVER(PARTITION BY p1.g ORDER BY p2.g) rnk
         FROM p p1,p p2
        WHERE p1.g<>p2.g
              )
       WHERE rn=rnk
)
SELECT * FROM g ORDER BY 1,2

    FROM_P       TO_P
---------- ----------
         1          5
         1          6
         1          7
         1          8
         2          9
         2         10
         2         11
         2         12
         3         13
         3         14
         3         15
         3         16
         4         17
         4         18
         4         19
         4         20
         5          1
         5          2
         5          3
         5          4
         6          9
         6         10
         6         11
         6         12
         7         13
         7         14
         7         15
         7         16
         8         17
         8         18
         8         19
         8         20
         9          1
         9          2
         9          3
         9          4
        10          5
        10          6
        10          7
        10          8
        11         13
        11         14
        11         15
        11         16
        12         17
        12         18
        12         19
        12         20
        13          1
        13          2
        13          3
        13          4
        14          5
        14          6
        14          7
        14          8
        15          9
        15         10
        15         11
        15         12
        16         17
        16         18
        16         19
        16         20
        17          1
        17          2
        17          3
        17          4
        18          5
        18          6
        18          7
        18          8
        19          9
        19         10
        19         11
        19         12
        20         13
        20         14
        20         15
        20         16

80 rows selected.

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
359#
发表于 2014-11-1 10:46 | 只看该作者
newkid 发表于 2014-10-31 02:20
如果旋转、翻转后重合的形状只能算一种:

WITH t AS (SELECT LEVEL N FROM DUAL CONNECT BY LEVEL

其实就等价于固定从某个点开始的连法数量

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
360#
发表于 2014-11-1 10:48 | 只看该作者
newkid 发表于 2014-11-1 02:19
野花要的X=20的分配策略,原来竟是如此简单!

平均分成五组,每组四个点。

我当时对着你ASCII树状图琢磨半天也没想出策略,后来发现,你那图是21个点的,囧啊

使用道具 举报

回复

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

本版积分规则 发表回复

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