楼主: newkid

PUZZLEUP 2014

[复制链接]
论坛徽章:
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
251#
发表于 2014-9-28 17:23 | 只看该作者
弄出来了, 但是跟两位版主弄得性能差很多。
思路是, 先求了2个马的可能情况, 再求2个车的可能情况, 最后再求所有可能情况。
代码贴出来, 献丑了。



WITH T AS (
          SELECT LEVEL N
                 ,CEIL(LEVEL/:N) X
                 ,MOD(LEVEL-1,:N) + 1 Y
          FROM DUAL CONNECT BY LEVEL <= :N*:N
         )
   ,T1 AS ( -- 只2匹马,所有可能的位子         
            SELECT  PRIOR N M1
                   ,N  M2
                   ,PRIOR X MX1
                   ,PRIOR Y MY1
                   ,X MX2
                   ,Y MY2
            FROM T
            WHERE LEVEL = 2
            CONNECT BY N > PRIOR N AND LEVEL <=2
            AND POWER((X - PRIOR X),2) + POWER((Y - PRIOR Y),2) <> 5
          )
   ,T2 AS ( -- 只2 个车,所有可能的位子
            SELECT  PRIOR N C1
                   ,N C2
                   ,PRIOR X CX1
                   ,PRIOR Y CY1
                   ,X CX2
                   ,Y CY2
            FROM T
            WHERE LEVEL = 2
            CONNECT BY N > PRIOR N AND LEVEL <=2
            AND NOT((X = PRIOR X ) OR (Y = PRIOR Y ))
          )
SELECT  COUNT(*) CNT
FROM T1 , T2
WHERE T1.MX1 <> T2.CX1  -- 马不能在车的线上
AND  T1.MX2 <> T2.CX1
AND  T1.MX1 <> T2.CX2
AND  T1.MX2 <> T2.CX2
AND  T1.MY1 <> T2.CY1
AND  T1.MY2 <> T2.CY1
AND  T1.MY1 <> T2.CY2
AND  T1.MY2 <> T2.CY2
AND  POWER((T1.MX1 - T2.CX1),2) + POWER((T1.MY1 - T2.CY1),2) <> 5  -- 车不能在马脚下
AND  POWER((T1.MX1 - T2.CX2),2) + POWER((T1.MY1 - T2.CY2),2) <> 5  
AND  POWER((T1.MX2 - T2.CX1),2) + POWER((T1.MY2 - T2.CY1),2) <> 5  
AND  POWER((T1.MX2 - T2.CX2),2) + POWER((T1.MY2 - T2.CY2),2) <> 5
;

-- 577056


使用道具 举报

回复
论坛徽章:
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
252#
 楼主| 发表于 2014-10-1 22:20 | 只看该作者
#10 Five-Letter Code

You will produce five-letter codes using the letters A, B, C, D, and E.

-You Are not allowed to produce a code that can be constructed by interchanging any two adjacent letters of an existing code.

What is the maximum number of different codes that can be produced according to this rule?

If the problem was asked for three-letter codes using the letters A, B, and C, then the answer would be 18.

AAA, AAB, AAC, ABB, ABC, ACC, BAA, BBA, BBB, BBC, BCA, BCC, CAA, CAB, CBB, CCA, CCB, CCC.

五字母代码
你将用字母A,B,C,D,E生成包含五个字母的代码。
你不允许产生这样的代码:它由一个已存在的代码的相邻两位交换而来。
根据这个规则,最多可以产生多少个不同的代码?
如果问题问的是利用字母A,B,C产生的三字母代码,那么答案是18。
AAA, AAB, AAC, ABB, ABC, ACC, BAA, BBA, BBB, BBC, BCA, BCC, CAA, CAB, CBB, CCA, CCB, CCC.
---------------
三字母还可以用SQL写出来,五个字母难度大得多。

使用道具 举报

回复
论坛徽章:
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
253#
 楼主| 发表于 2014-10-1 22:25 | 只看该作者
本帖最后由 newkid 于 2014-10-1 22:43 编辑

从三个字母的来看是很有规律的,就是按顺序添加,不符合条件的丢弃。如果这样的话走一遍就得到结果了。但如何证明这样得到的是最大集合?

DECLARE
   TYPE t_exist IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
   TYPE t_res IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
   lv_exist t_exist;
   lv_res t_res;
   N PLS_INTEGER :=5;
BEGIN

   FOR lv_rec IN (
       SELECT REPLACE(SYS_CONNECT_BY_PATH(c,','),',') code
         FROM (SELECT CHR(64+LEVEL) c FROM DUAL CONNECT BY LEVEL<=N)
       WHERE LEVEL=N
       CONNECT BY LEVEL<=N
       ORDER BY 1
       )
   LOOP
       IF NOT lv_exist.EXISTS(lv_rec.code) THEN
          lv_res(lv_res.count+1) := lv_rec.code;
          lv_exist(lv_rec.code):=1;
          FOR i IN 1..N-1 LOOP
              lv_exist(SUBSTR(lv_rec.code,1,i-1)||SUBSTR(lv_rec.code,i+1,1)||SUBSTR(lv_rec.code,i,1)||SUBSTR(lv_rec.code,i+2)):=1;
          END LOOP;
       END IF;
   END LOOP;
   DBMS_OUTPUT.PUT_LINE(lv_res.count);
END;
/

1625

牛蛙PETER快来证明一下!

使用道具 举报

回复
论坛徽章:
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
254#
发表于 2014-10-1 23:00 来自手机 | 只看该作者
power 5 5=3125

使用道具 举报

回复
论坛徽章:
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
255#
 楼主| 发表于 2014-10-2 00:03 | 只看该作者
〇〇 发表于 2014-10-1 23:00
power 5 5=3125

这有什么用?现在是要找出一个最大的子集使得任意两个元素之间都满足那个规则。

使用道具 举报

回复
论坛徽章:
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
256#
发表于 2014-10-2 07:17 | 只看该作者
newkid 发表于 2014-10-2 00:03
这有什么用?现在是要找出一个最大的子集使得任意两个元素之间都满足那个规则。

你这个办法是对5个字母公平的,只要验证不包含在内的每个字符串都不符合那个规则

使用道具 举报

回复
论坛徽章:
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
257#
 楼主| 发表于 2014-10-2 09:33 | 只看该作者
〇〇 发表于 2014-10-2 07:17
你这个办法是对5个字母公平的,只要验证不包含在内的每个字符串都不符合那个规则

你这没头没脑的几个数字竟然包含了这么深刻的哲理?

我的算法注定了被抛弃的每个代码都加不回去。但这没用,有可能你加入几个,挤走几个,又能够再加入更多的代码。必须证明再加回去的怎么也不会比挤走的更多。

使用道具 举报

回复
论坛徽章:
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
258#
发表于 2014-10-2 16:58 | 只看该作者
本帖最后由 peter1166 于 2014-10-2 17:02 编辑
newkid 发表于 2014-10-1 22:25
从三个字母的来看是很有规律的,就是按顺序添加,不符合条件的丢弃。如果这样的话走一遍就得到结果了。但如 ...


我是找规律算的是 1875 .
3个的时候,
( 1+2+3 ) 这是一个块儿里的数量,
(3*3*3)  总数
(3*3*3) / (3*3) 这个是块儿的个数。

-----------------
AAA AAB AAC
       ABB ABC
              ACC
-----------------
BAA
BBA BBB BBC
BCA        BCC
-----------------
CAA CAB
       CBB
CCA CCB CCC
-----------------


( 1+2+3 ) * (3*3*3) / (3*3) = 18
( 1+2+3+4 ) * (4*4*4*4) / (4*4) = 160
( 1+2+3+4+5 ) * (5*5*5*5*5) / (5*5) =  1875

使用道具 举报

回复
论坛徽章:
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
259#
发表于 2014-10-2 18:11 | 只看该作者
peter1166 发表于 2014-10-2 16:58
我是找规律算的是 1875 .
3个的时候,
( 1+2+3 ) 这是一个块儿里的数量,

列出来?

使用道具 举报

回复
论坛徽章:
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
260#
 楼主| 发表于 2014-10-2 22:03 | 只看该作者
peter1166 发表于 2014-10-2 16:58
我是找规律算的是 1875 .
3个的时候,
( 1+2+3 ) 这是一个块儿里的数量,

你这“块数”的公式是什么意思?(4*4*4*4) / (4*4) ,  (5*5*5*5*5) / (5*5)

使用道具 举报

回复

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

本版积分规则 发表回复

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