某天晚上有A、B、C、D四个人要通过一座桥,他们只有一个手电筒,每次过桥都需要手电筒照明,桥上每次最多可同时过两个人,他们全部从一边到达桥另一边有多少种方案。请用一条sql完成并输出所有方案(列出每个方案中每个人过桥次数)。
答案示例:
A B C D
1 2 3 4有没有大神会的

解决方案 »

  1.   


    SQL> with m as (
      2  select 'A' n from dual union all
      3  select 'B' n from dual union all
      4  select 'C' n from dual union all
      5  select 'D' n from dual
      6  )
      7  select m1.n n1, m2.n n2, m3.n n3, m4.n n4
      8  from m m1, m m2, m m3, m m4
      9  where regexp_count(m1.n || m2.n || m3.n || m4.n, 'A') = 1
     10  and regexp_count(m1.n || m2.n || m3.n || m4.n, 'B') = 1
     11  and regexp_count(m1.n || m2.n || m3.n || m4.n, 'C') = 1
     12  and regexp_count(m1.n || m2.n || m3.n || m4.n, 'D') = 1;
    N1 N2 N3 N4
    -- -- -- --
    A  B  C  D
    A  B  D  C
    A  C  B  D
    A  C  D  B
    A  D  B  C
    A  D  C  B
    B  A  C  D
    B  A  D  C
    B  C  A  D
    B  C  D  A
    B  D  A  C
    B  D  C  A
    C  A  B  D
    C  A  D  B
    C  B  A  D
    C  B  D  A
    C  D  A  B
    C  D  B  A
    D  A  B  C
    D  A  C  B
    D  B  A  C
    D  B  C  A
    D  C  A  B
    D  C  B  A
    24 rows selectedSQL> 
      

  2.   

    肯定要限制以最少次数过桥,不然就无穷解了,
    应该是3去(2人),2回(1人来接),一共最少过桥3*2+2=8次
    也就是要满足下面条件的就是解,
    1、每人至少过桥1次
    2、每人过桥奇数次(偶数就回来了)
    3、总和是8次(个人最大5次)
    with tab as (select 1 as n from dual union all select 3 from dual union all select 5 from dual)
    select a.n as a,b.n as b,c.n as c,d.n as d
    from tab a,tab b,tab c,tab d
    where a.n + b.n + c.n + d.n = 8
    A B C D
    1 1 1 5
    1 1 3 3
    1 1 5 1
    1 3 1 3
    1 3 3 1
    1 5 1 1
    3 1 1 3
    3 1 3 1
    3 3 1 1
    5 1 1 1