WITH T1 AS( --已经被下过子的位置
SELECT L,S,ROW_NUMBER() OVER(PARTITION BY s ORDER BY L DESC ) R FROM (
select LEVEL L,SUBSTR('---------',LEVEL,1) S from DUAL CONNECT BY LEVEL<=3*3) where S<>'-'
), CURRENT_BOR AS (--当前的局面是怎么样的
select s,list_o o,b_o,list_x x,b_x --s 为一共落子的数,O表示当前O落的位置有哪些 B_O表示O当前的局面 X同理
FROM(SELECT count(*) s from T1) nm,
(select ','||LISTAGG(L,',') WITHIN GROUP(ORDER BY R DESC) list_o,
replace('---------','X','-') b_o FROM T1 where s='O') t_O,
(select ','||LISTAGG(L,',') WITHIN GROUP(ORDER BY R DESC) list_x,
replace('---------','O','-') b_X FROM T1 where s='X') t_X
),T_ADD_SOURCE AS( --还可以落子的位置
SELECT L FROM (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL<=3*3) WHERE L NOT IN (SELECT L FROM T1) order by l
)
,ALL_T(s,b_all,qz) AS (
SELECT c.s,'---------' b_all,1 FROM CURRENT_BOR c
UNION ALL
SELECT at.s+1 s,
SUBSTR(at.b_all,1,t.L-1)||DECODE(MOD(at.s,2) ,0,'X','O')||SUBSTR(at.b_all,t.L+1) b_all,
GREATEST(1,
(SELECT MAX(GREATEST(
LEAST(INSTR((SELECT LISTAGG(CASE WHEN u
ELSE SUBSTR(b_all,t.l+(u-CEIL(t.l/3))*(3+1),1) END) WITHIN GROUP(ORDER BY u) FROM (SELECT LEVEL u FROM DUAL CONNECT BY LEVEL <= 3)
WHERE u<=(SELECT max(u) from t WHERE u=CEIL(CASE WHEN u<=CEIL(t.l/3) THEN t.l-(CEIL(t.l/3)-u)*(3+1) ELSE t.l+(u-CEIL(t.l/3))*(3+1) END/3))
AND u>=(SELECT min(u) from t WHERE u=CEIL(CASE WHEN u<=CEIL(t.l/3) THEN t.l-(CEIL(t.l/3)-u)*(3+1) ELSE t.l+(u-CEIL(t.l/3))*(3+1) END/3))),
LPAD(DECODE(MOD(at.s,2),0,'X','O'),LEVEL,DECODE(MOD(at.s,2),0,'X','O'))),1)*LEVEL
,2
)) FROM dual CONNECT BY LEVEL <= 3)
)
FROM ALL_T at,T_ADD_SOURCE t
WHERE at.s<3*3
)select * from ALL_T