谁有闲,进来做简单 SQL 题

heureux

闲逛
管理成员
VIP
注册
2004-07-18
消息
46,713
荣誉分数
20,687
声望点数
1,393
这是某网站上周的 SQL 竞赛题(已经CLOSE), 奖品有 iPod, USB 硬盘,等。

想组织个队伍去参加第二期,有报名的么? :p



shujuku.jpg


在5X5的方格棋盘中(如图),每行、列、斜线(斜线不仅仅包括对角线)最多可以放两个球,如何摆放才能放置最多的球,这样的摆法总共有几种?输出所有的摆法。

要求:用一句SQL实现。


输出格式:
从方格棋盘第一行至第5行,每行从第一列到第5列依次输出,0表示不放球,1表示放球。例如:1001000000000000000000000。一行输出一个行号和一个解,按解所在的列字符串顺序从大到小排序。

数据库平台:适用Oracle、MS SQL Sever,版本(Oracle推荐10gr2(包含)以上版本、MS SQL Sever推荐2008版本)
 
感觉像线性代数,not SQL....:D:D
 
什么网站呀,给个地址?

这是某网站上周的 SQL 竞赛题(已经CLOSE), 奖品有 iPod, USB 硬盘,等。

想组织个队伍去参加第二期,有报名的么? :p



浏览附件195645


在5X5的方格棋盘中(如图),每行、列、斜线(斜线不仅仅包括对角线)最多可以放两个球,如何摆放才能放置最多的球,这样的摆法总共有几种?输出所有的摆法。

要求:用一句SQL实现。


输出格式:
从方格棋盘第一行至第5行,每行从第一列到第5列依次输出,0表示不放球,1表示放球。例如:1001000000000000000000000。一行输出一个行号和一个解,按解所在的列字符串顺序从大到小排序。

数据库平台:适用Oracle、MS SQL Sever,版本(Oracle推荐10gr2(包含)以上版本、MS SQL Sever推荐2008版本)
 
俺想组团,你想去单挑? :p:D
 
嗯,单挑。组团?要是idea全是我的,最后还要和你分ipad,我不是赔了?
我也去给他们出一个题,一句SQL解决四色问题。奖品:要啥都给。

俺想组团,你想去单挑? :p:D
 
嗯,单挑。组团?要是idea全是我的,最后还要和你分ipad,我不是赔了?
我也去给他们出一个题,一句SQL解决四色问题。奖品:要啥都给。
这个题不是吹牛题,上周有 56 人给了答案。

BTW, 网址早就给你了哈,在QQH里 :D
 
56个人给答案了?那太简单了,我不做。
。。。。

哥们,啥叫SQL啊?

这个题不是吹牛题,上周有 56 人给了答案。

BTW, 网址早就给你了哈,在QQH里 :D
 
这个好办,要是我们三个人组团得了一个ipad,
我们在凑钱买两个,这样相当于每个人都打了6折,VIP的待遇啊。
你去看了么? 第二期 :p
 
你先和热狗组团,我先恶补SQL
不带楼主玩? 好像他也知道 SQL的 :blowzy:

--注一下: 把第一个字看成 我 了 :crying:
 
楼主,下次弄得简单点行吗?
:D

代码:
WITH
    --每个位置放或不放
    choice AS
    (SELECT 1 c
        FROM dual
      UNION ALL
      SELECT 0 c
        FROM dual),
    --5行
    rows_level AS
    (SELECT LEVEL l
        FROM dual
      CONNECT BY LEVEL = 5),
    --5X5的格子,建立坐标
    board AS
    (SELECT /*+ materialize  */
       x.l AS x,
       y.l AS y,
       x.l + y.l AS z1,
       x.l - y.l AS z2,
       x.l + 10 * y.l AS n,
       x.l * 5 + y.l AS P
        FROM (SELECT LEVEL - 1 l
                FROM dual
              CONNECT BY LEVEL = 5) x,
             (SELECT LEVEL - 1 l
                FROM dual
              CONNECT BY LEVEL = 5) y),
    --每行最多放2个,列出所有行组合的情况,同时也排除了行
    comb AS
    (SELECT ROWNUM AS comb_id,
             t1.c || t2.c || t3.c || t4.c || t5.c AS comb_value
        FROM choice t1, choice t2, choice t3, choice t4, choice t5
       WHERE t1.c + t2.c + t3.c + t4.c + t5.c = 2),
    --列出摆放情况
    placed_on AS
    (SELECT /*+ materialize  */
             REPLACE(sys_connect_by_path(comb_value, ','), ',', '') temp_result
        FROM comb
       WHERE LEVEL = 5
      CONNECT BY NOCYCLE /*PRIOR comb_id != comb_id
             AND */LEVEL = 5),
    --排除列
    removed_exceed_col AS
    (SELECT /*+ materialize  */
       a.temp_result
        FROM placed_on a, rows_level b
       GROUP BY a.temp_result
      HAVING MAX(SUBSTR(a.temp_result, b.l + 0 * 5, 1) +
                 SUBSTR(a.temp_result, b.l + 1 * 5, 1) +
                 SUBSTR(a.temp_result, b.l + 2 * 5, 1) +
                 SUBSTR(a.temp_result, b.l + 3 * 5, 1) +
                 SUBSTR(a.temp_result, b.l + 4 * 5, 1)
                 ) = 2),
    --排除斜线
    removed_exceed_bias AS
    (SELECT /*+ materialize  */
             temp_result AS final_answer
        FROM (SELECT a.temp_result,
                     b.z1,
                     b.z2,
                     SUM(SUBSTR(a.temp_result, b.p + 1, 1)) OVER(PARTITION BY a.temp_result, b.z1) v1,
                     SUM(SUBSTR(a.temp_result, b.p + 1, 1)) OVER(PARTITION BY a.temp_result, b.z2) v2
                FROM removed_exceed_col a, board b)
       GROUP BY temp_result
      HAVING MAX(v1) = 2 AND MAX(v2) = 2)
    --最终结果
    SELECT RANK() OVER(ORDER BY final_answer DESC) rn, final_answer
      FROM removed_exceed_bias
    ORDER BY final_answer DESC
 
后退
顶部
首页 论坛
消息
我的