用sql實現的n王后
利用oracle的遞迴cte
var n number exec :n:=8 with p(p,r,c,w) as(select level,ceil(level/:n),mod(level-1,:n)+1,power(2,level-1) from dual connect by level<=:n*:n) ,w as(select q.p,q.r,q.c,q.w,sum(p.w)sw from p,p q where 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 group by q.p,q.r,q.c,q.w) ,b(board, n_queens,w)as( SELECT lpad('-',p-1,'-')||'*', 1 ,w FROM p where p<=:N UNION all SELECT rpad(board,p-1,'-') || '*' ,N_queens + 1 ,b.w+w.w FROM b, w WHERE n_queens <:N and p >n_queens*:N and p<=(n_queens+1)*:N and bitand(b.w,sw)=0 ) select rpad(board,:N*:N,'-')board from b where n_queens =:N ;
利用對稱優化,第一行只取N/2個位置,然後把結果延Y軸翻轉。如果N是奇數,那麼第1行取(N+1)/2,第2行取(N-1)/2。因為1列只允許1個王后,所以從第2行起,中間列都是空的。
with p(p,r,c,w) as(select level,ceil(level/:n),mod(level-1,:n)+1,power(2,level-1) from dual connect by level<=:n*:n) ,w as(select q.p,q.r,q.c,q.w,sum(p.w)sw from p,p q where 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 group by q.p,q.r,q.c,q.w) ,b(board, n_queens,w)as( SELECT lpad('-',p-1,'-')||'*', 1 ,w FROM p where p<=(case mod(:N,2) when 0 then :N/2 else (:N+1)/2 end) UNION all SELECT rpad(board,p-1,'-') || '*' ,N_queens + 1 ,b.w+w.w FROM b, w WHERE n_queens <:N and p >n_queens*:N and 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 then (n_queens+1)*:N-(:N+1)/2 else (n_queens+1)*:N end and bitand(b.w,sw)=0 ), hf as(select rpad(board,:N*:N,'-')board from b where n_queens =:N) select * from hf union all select listagg(reverse(substr(board,(l-1)*:N+1,:N))) within group(order by l) from hf a,(select level l from dual connect by level<=:N)b group by board ;
執行時間減少1/3。
相關文章
- 改進的sql計算n王后SQL
- 多執行緒解n王后問題的優化執行緒優化
- SQL Server--實現 Limit m, n 的功能SQLServerMIT
- 如何在SQL Server中實現 Limit m,n 的功能SQLServerMIT
- 利用C++多執行緒優化n王后問題C++執行緒優化
- 用pandas實現SQL功能SQL
- 用q實現篩法求1-n的質數
- 多執行緒結合經典位運算解n王后問題的優化執行緒優化
- 用SQL實現Farey數列SQL
- 實現自然數N的全排列
- 用SQL實現撲克牌排序SQL排序
- 用SQL實現99乘法表SQL
- 三欄佈局的n種實現
- css 實現豎直居中的 N 種場景及 N 種方法CSS
- 用網雲穿在 N1 盒子上實現 Openwrt 的內網穿透內網穿透
- 統計輸入的單詞中有幾個長度大於n的,n是自己指定的,用函式物件實現函式物件
- 求1+2+...+n(Java實現)Java
- vue實現單點登入的N種方式Vue
- 實用的SQL語句~!SQL
- TOP N 查詢 SQLSQL
- 在MySQL中,如何實現Top N及M至N段的記錄查詢?MySql
- oracle資料庫用sql實現快速分頁Oracle資料庫SQL
- Python單例模式(Singleton)的N種實現Python單例模式
- 實現同比、環比計算的N種姿勢
- 伺服器實現埠轉發的N種方式伺服器
- sql1035NSQL
- 9*9乘法口決pl/sql的多種方法實現(pl/sql實現)SQL
- [20130803]ORACLE 12C TOP N SQL實現分頁功能.txtOracleSQL
- 格式化輸出n天后的時間(java實現 )Java
- Oracle10g實現只讀表的N種方法Oracle
- AWR TOP SQL實現SQL
- SQL SERVER實用技巧SQLServer
- [Shell] AWK實現SQL的功能(1)SQL
- 實現累加的經典sql方法SQL
- 實現PL/SQL的版本控制-SVNSQL
- sql 實現表的行列轉換SQL
- sql行列轉置的實現方法SQL
- [SQL Server]分頁功能的實現SQLServer