井字棋解法(补充)

还是井字棋
http://blog.itpub.net/29254281/viewspace-1852817/


今天和王工相互印证之下,发现原来的SQL还是有点问题.
1.原来的SQL没有计算平局的情况
2.我对于棋盘的理解有错误.
下面这个棋盘(Board)

MOVES=3175968,

BOARD=XOXOXOX,

WINNER=X


其实应该是 O-X-OOXXX
居然把题目理解错了...

3.还有一个bug. 假如先手和后手走完了整个棋局,那么先手下了五个子,而后手仅仅下了四个子.

所以原来SQL的这个部分,标红加粗部分应该删除.
  1.     select n1.id||n2.id||n3.id||n4.id||n5.id||n6.id||n7.id||n8.id||n9.id moves,  
  2.     n1.id||n3.id||n5.id||n7.id||n9.id X,  
  3.     n2.id||n4.id||n6.id||n8.id||n9.id O,  

其实应该是
  1.     select n1.id||n2.id||n3.id||n4.id||n5.id||n6.id||n7.id||n8.id||n9.id moves,  
  2.     n1.id||n3.id||n5.id||n7.id||n9.id X,  
  3.     n2.id||n4.id||n6.id||n8.id O,  

所以经过修正之后的SQL,应该如下:
  1. create table t1 as     
  2. with nums as (    
  3.     select level id from dual connect by level<=9    
  4. ),    
  5. MOVES as(    
  6.     select n1.id||n2.id||n3.id||n4.id||n5.id||n6.id||n7.id||n8.id||n9.id moves,    
  7.     n1.id||n3.id||n5.id||n7.id||n9.id X,    
  8.     n2.id||n4.id||n6.id||n8.id O   
  9.     from     
  10.     nums n1,    
  11.     nums n2,    
  12.     nums n3,    
  13.     nums n4,    
  14.     nums n5,    
  15.     nums n6,    
  16.     nums n7,    
  17.     nums n8,    
  18.     nums n9    
  19.     where     
  20.     (n1.id!=n2.id and n1.id!=n3.id and n1.id!=n4.id and n1.id!=n5.id and n1.id!=n6.id and n1.id!=n7.id and n1.id!=n8.id and n1.id!=n9.id) and     
  21.     (n2.id!=n1.id and n2.id!=n3.id and n2.id!=n4.id and n2.id!=n5.id and n2.id!=n6.id and n2.id!=n7.id and n2.id!=n8.id and n2.id!=n9.id) and     
  22.     (n3.id!=n2.id and n3.id!=n1.id and n3.id!=n4.id and n3.id!=n5.id and n3.id!=n6.id and n3.id!=n7.id and n3.id!=n8.id and n3.id!=n9.id) and     
  23.     (n4.id!=n2.id and n4.id!=n3.id and n4.id!=n1.id and n4.id!=n5.id and n4.id!=n6.id and n4.id!=n7.id and n4.id!=n8.id and n4.id!=n9.id) and     
  24.     (n5.id!=n2.id and n5.id!=n3.id and n5.id!=n4.id and n5.id!=n1.id and n5.id!=n6.id and n5.id!=n7.id and n5.id!=n8.id and n5.id!=n9.id) and     
  25.     (n6.id!=n2.id and n6.id!=n3.id and n6.id!=n4.id and n6.id!=n5.id and n6.id!=n1.id and n6.id!=n7.id and n6.id!=n8.id and n6.id!=n9.id) and     
  26.     (n7.id!=n2.id and n7.id!=n3.id and n7.id!=n4.id and n7.id!=n5.id and n7.id!=n6.id and n7.id!=n1.id and n7.id!=n8.id and n7.id!=n9.id) and     
  27.     (n8.id!=n1.id and n8.id!=n3.id and n8.id!=n4.id and n8.id!=n5.id and n8.id!=n6.id and n8.id!=n7.id and n8.id!=n2.id and n8.id!=n9.id) and    
  28.     (n9.id!=n2.id and n9.id!=n3.id and n9.id!=n4.id and n9.id!=n5.id and n9.id!=n6.id and n9.id!=n7.id and n9.id!=n8.id and n9.id!=n1.id)      
  29. ),    
  30. v1 as (    
  31.     select m.*,    
  32.     translate(m.X,'123456789','1__4__7__') xc1,     
  33.     translate(m.X,'123456789','_2__5__8_') xc2,     
  34.     translate(m.X,'123456789','__3__6__9') xc3,     
  35.     translate(m.X,'123456789','1___5___9') xc4,     
  36.     translate(m.X,'123456789','__3_5_7__') xc5,    
  37.     translate(m.X,'123456789','123______') xc6,    
  38.     translate(m.X,'123456789','___456___') xc7,    
  39.     translate(m.X,'123456789','______789') xc8,    
  40.     translate(m.O,'123456789','1__4__7__') oc1,     
  41.     translate(m.O,'123456789','_2__5__8_') oc2,     
  42.     translate(m.O,'123456789','__3__6__9') oc3,     
  43.     translate(m.O,'123456789','1___5___9') oc4,     
  44.     translate(m.O,'123456789','__3_5_7__') oc5,    
  45.     translate(m.O,'123456789','123______') oc6,    
  46.     translate(m.O,'123456789','___456___') oc7,    
  47.     translate(m.O,'123456789','______789') oc8    
  48.     from moves m    
  49. ),    
  50. score as (    
  51.     select     
  52.     v1.*,    
  53.     least(    
  54.         decode(regexp_instr(xc1,'[1-9]',1,3) ,0,999,regexp_instr(xc1,'[1-9]',1,3)),    
  55.         decode(regexp_instr(xc2,'[1-9]',1,3) ,0,999,regexp_instr(xc2,'[1-9]',1,3)),    
  56.         decode(regexp_instr(xc3,'[1-9]',1,3) ,0,999,regexp_instr(xc3,'[1-9]',1,3)),    
  57.         decode(regexp_instr(xc4,'[1-9]',1,3) ,0,999,regexp_instr(xc4,'[1-9]',1,3)),    
  58.         decode(regexp_instr(xc5,'[1-9]',1,3) ,0,999,regexp_instr(xc5,'[1-9]',1,3)),    
  59.         decode(regexp_instr(xc6,'[1-9]',1,3) ,0,999,regexp_instr(xc6,'[1-9]',1,3)),    
  60.         decode(regexp_instr(xc7,'[1-9]',1,3) ,0,999,regexp_instr(xc7,'[1-9]',1,3)),    
  61.         decode(regexp_instr(xc8,'[1-9]',1,3) ,0,999,regexp_instr(xc8,'[1-9]',1,3))    
  62.     
  63.     ) xscore,    
  64.     least(    
  65.         decode(regexp_instr(oc1,'[1-9]',1,3) ,0,999,regexp_instr(oc1,'[1-9]',1,3)),    
  66.         decode(regexp_instr(oc2,'[1-9]',1,3) ,0,999,regexp_instr(oc2,'[1-9]',1,3)),    
  67.         decode(regexp_instr(oc3,'[1-9]',1,3) ,0,999,regexp_instr(oc3,'[1-9]',1,3)),    
  68.         decode(regexp_instr(oc4,'[1-9]',1,3) ,0,999,regexp_instr(oc4,'[1-9]',1,3)),    
  69.         decode(regexp_instr(oc5,'[1-9]',1,3) ,0,999,regexp_instr(oc5,'[1-9]',1,3)),    
  70.         decode(regexp_instr(oc6,'[1-9]',1,3) ,0,999,regexp_instr(oc6,'[1-9]',1,3)),    
  71.         decode(regexp_instr(oc7,'[1-9]',1,3) ,0,999,regexp_instr(oc7,'[1-9]',1,3)),    
  72.         decode(regexp_instr(oc8,'[1-9]',1,3) ,0,999,regexp_instr(oc8,'[1-9]',1,3))    
  73.     ) oscore    
  74.     from v1    
  75. )    
  76. select distinct    
  77. case when xscore<=oscore then substr(score.moves,0,xscore*2-1) else substr(score.moves,0,2*oscore) end moves,    
  78. regexp_replace(  
  79.   regexp_replace(  
  80.     regexp_replace('123456789','['||case when xscore<=oscore then substr(x,0,xscore) else substr(x,0,oscore) end||']','X')  
  81.     ,'['||case when xscore<=oscore then substr(o,0,xscore-1) else substr(o,0,oscore) end||']','O'),'[1-9]','-') board,  
  82. case when xscore=oscore and oscore=999 then '-' when xscore<=oscore then 'X' else 'O' end winner    
  83. from score;    

用时:309s
结果:
select winner,count(*) from t1 group by winner;
X 131184
- 46080
O 77904



这个结果和王工计算的结果一致.应该是正确的.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1853692/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29254281/viewspace-1853692/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值