用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 Server中實現 Limit m,n 的功能SQLServerMIT
- 用pandas實現SQL功能SQL
- sql1035NSQL
- 用網雲穿在 N1 盒子上實現 Openwrt 的內網穿透內網穿透
- Python單例模式(Singleton)的N種實現Python單例模式
- vue實現單點登入的N種方式Vue
- SQL SERVER實用技巧SQLServer
- AWR TOP SQL實現SQL
- 伺服器實現埠轉發的N種方式伺服器
- 實現同比、環比計算的N種姿勢
- python實現readline去掉換行符nPython
- Lumen 實現 SQL 監聽SQL
- 用建造者模式實現一個防SQL隱碼攻擊的ORM框架模式SQLORM框架
- Cobar SQL審計的設計與實現SQL
- Flink SQL 如何實現資料流的 Join?SQL
- SQL 如何實現動態的行列轉置SQL
- 位運算與SQL實現SQL
- Dynamics CRM實體系列之1:N、N:1以及N:N關係
- 使用vue-i18n實現國際化Vue
- 五個實用的SQL Server PowerShell指令碼OMSQLServer指令碼
- 記一個實用的sql查詢語句SQL
- 編寫程式實現 f(n)=f(n-1)+f(n-2) (f(1)=1 和 f(2)=2 )函式。函式
- ASEMI的MOS管25N120在不同應用場景的表現
- MyBatis標籤實現的動態SQL語句MyBatisSQL
- SQL 如何查詢連續上漲 N 次的記錄SQL
- Python實用技法第2篇:使用deque保留最新的N個元素Python
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 實現MyBatisPlus自定義sql注入器MyBatisSQL
- 在openwrt路由中加入n2n,並在ubuntu里加入n2n服務,實現開機聯網互通互訪路由Ubuntu
- SQL1116N A connection to or activation of database "TESTDB" cannot be madeSQLDatabase
- mybatis實現變數定義,實現sql業務程式碼MyBatis變數SQL
- 織夢CMS最簡單實用的SQL語句SQL
- nginx 實現實用的灰度釋出Nginx
- PostgreSQL、Oracle/MySQL和SQL Server的MVCC實現原理方式OracleMySqlServerMVC
- SQL Server的Merge —— 一步實現 insert,update,deleteSQLServerdelete
- 棧的應用和實現
- N 種僅僅使用 HTML/CSS 實現各類進度條的方式HTMLCSS
- 數棧技術分享:用短平快的方式告訴你Flink-SQL的擴充套件實現SQL套件
- monaco-editor 實現SQL編輯器SQL