|
create or replace procedure sd5(a in varchar)
is
type int_varray3 is varray(81) of varchar(10);
ex int_varray3:=int_varray3();
type int_varray is varray(20) of int;
type int_varray2 is varray(81) of int_varray;
sd int_varray2:=int_varray2();
procedure init
is
k int;
begin
--find each one's 20 neibour
sd.extend(81);
ex.extend(81);
for i in 1..81 loop
sd(i):=int_varray();
sd(i).extend(20);
k:=1;
for j in 1..81 loop
if i<>j and ((floor((i-1)/9) = floor((j-1)/9)) or
(mod(i-j, 9) = 0) or
(floor((i-1)/27) = floor((j-1)/27) and floor(mod(i-1,9)/3) = floor(mod(j-1,9)/3))) then
if substr(a,j,1)='0' then
sd(i)(k):=j;
k:=k+1;
elsif instr(ex(i),substr(a,j,1))=0 or instr(ex(i),substr(a,j,1)) is null then
ex(i):=ex(i)||substr(a,j,1);
end if;
end if;
end loop;
dbms_output.put_line('');
end loop;
end;
procedure sd5_inner(a in varchar)
as
i int;
n int;
e varchar(10);
begin
i:=instr(a,'0');
if (i=0) then
dbms_output.put_line(a);
return;
end if;
e:='a'||ex(i);
--lookup in 20 neibour
for j in 1..20 loop
n:=sd(i)(j);
if n is null then
exit;
end if;
if instr(e,substr(a,n,1))=0 and substr(a,n,1)<>0 then
e:=e||substr(a,n,1);
end if;
end loop;
for m in 1 ..9 loop
if instr(e,m)=0 then
--dbms_output.put_line(substr(a,1,i-1)||'('||m||')'||substr(a,i+1));
sd5_inner(substr(a,1,i-1)||m||substr(a,i+1));
end if;
end loop;
end;
begin
init;
sd5_inner(a);
end;
/
|
|