|
lyzhanhun 发表于 2013-11-22 19:43 ![]()
思路错啦 弄了个简单点的 另外求教最后输出怎么弄
declare
Var V_Width Number;
Exec :V_Width := 4;
Var V_Height Number;
EXEC :v_height := 4;
VAR V_CNT number;
Exec :V_Cnt := 3;
Var V_Str Varchar2(1000);
exec :v_str :=' * * * ';
With Tmp1 As (Select :V_Str V_Str,to_number(:V_Height) V_Height,to_number(:V_Width) V_Width,:V_Width * :V_Height V_Len From Dual),
Tmp2 As(Select Level R,Decode(Mod(Level,V_Width),0,V_Width,Mod(Level,V_Width)) X,Trunc((Level-1)/V_Width+1) Y,
Decode(Substr(V_Str,Level,1),' ','90','*','9','别闹') Value
FROM TMP1 CONNECT BY level<=V_LEN) ,
Tmp3 As (Select T2.X,T2.Y,
Decode(T2.Value,90,(Select Count(*) From Tmp2 T
Where T.X Between T2.X-1 And T2.X+1 And T.Y Between T2.Y-1 And T2.Y+1 And T.Value='9'),T2.Value) Value
From Tmp2 T2)
Select Listagg(Decode(Value,'9','*',0,' ',Value),'') Within Group(Order By Y,X) str From Tmp3;
--tmp1:将需要的一些常量通过临时表保存起来,其中对宽和高转换为数字类型,便于最后的输出排序
--tmp2:通过数学公式的方法,将宽和高输出,凑成坐标。并对每个值加以分析,如果是空格定义值为90,‘*’定义为9,防止恶意份子破坏,其他值也做了输出。
--tmp3:通过标量子查询的方法,对坐标中的value值为90加以分析,算其周围8个坐标是否有9(也就是雷),求数据量
--最后用Listagg的方法,通过排序将分析好的tmp3中的value值输出
我提交的答案也搞复杂了。。。。还搞笑了。。。 |
|