|
加上翻转代码,还是快了1/3
SQL> truncate table temp;
表被截断。
已用时间: 00: 00: 00.01
SQL> exec :n:=10
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.01
SQL> insert into temp
2 with p(p,r,c,w)
3 as(select level,ceil(level/:n),mod(level-1,:n)+1,power(2,level-1) from dual connect by level<=:n*:n)
4 ,w as(select q.p,q.r,q.c,q.w,sum(p.w)sw from p,p q where
5 p.r=q.r or p.c=q.c or q.r-q.c=p.r-p.c or q.r+q.c=p.r+p.c
6 group by q.p,q.r,q.c,q.w)
7 ,b(board, n_queens,w)as(
8 SELECT lpad('-',p-1,'-')||'*', 1 ,w
9 FROM p where p<=(case mod(:N,2) when 0 then :N/2 else (:N+1)/2 end)
10 UNION all
11 SELECT
12 rpad(board,p-1,'-') || '*' ,N_queens + 1 ,b.w+w.w
13 FROM b, w
14 WHERE n_queens <:N
15 and p >n_queens*:N and
16 p<=case when mod(:N,2)=1 and /*N_queens=1 and*/ b.w=power(2,(:N-1)/2) -- mid of row 1 is set
17 then (n_queens+1)*:N-(:N+1)/2
18 else (n_queens+1)*:N end
19 and bitand(b.w,sw)=0
20 ),
21 hf as(select rpad(board,:N*:N,'-')board from b where n_queens =:N)
22 select * from hf
23 union all
24 select listagg(reverse(substr(board,(l-1)*:N+1,:N)))
25 within group(order by l) from hf a,(select level l from dual connect by level<=:N)b
26 group by board
27 ;
已创建 724 行。
已用时间: 00: 00: 01.00
SQL> truncate table temp2;
表被截断。
已用时间: 00: 00: 00.07
SQL> create table temp2 (board varchar(256));
create table temp2 (board varchar(256))
*
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用
已用时间: 00: 00: 00.06
SQL> insert into temp2
2 with p(p,r,c,w)
3 as(select level,ceil(level/:n),mod(level-1,:n)+1,power(2,level-1) from dual connect by level<=:n*:n)
4 ,w as(select q.p,q.r,q.c,q.w,sum(p.w)sw from p,p q where
5 p.r=q.r or p.c=q.c or q.r-q.c=p.r-p.c or q.r+q.c=p.r+p.c
6 group by q.p,q.r,q.c,q.w)
7 ,b(board, n_queens,w)as(
8 SELECT lpad('-',p-1,'-')||'*', 1 ,w
9 FROM p where p<=:N
10 UNION all
11 SELECT
12 rpad(board,p-1,'-') || '*' ,N_queens + 1 ,b.w+w.w
13 FROM b, w
14 WHERE n_queens <:N
15 and p >n_queens*:N and p<=(n_queens+1)*:N
16 and bitand(b.w,sw)=0
17 )
18 select rpad(board,:N*:N,'-')board from b where n_queens =:N
19 ;
已创建 724 行。
已用时间: 00: 00: 01.49
SQL> select count(*) from(select * from temp2 intersect select * from temp);
COUNT(*)
----------
724
已用时间: 00: 00: 00.03
|
|