|
奇怪,改为bitand反而慢了
create or replace procedure sd3b(a in varchar)
as
i int;
r int;
c int;
r0 int;
c0 int;
n int;
e int;
begin
i:=instr(a,'0');
if (i=0) then
dbms_output.put_line(a);
return;
end if;
e:=0;
r:=floor((i-1)/9)+1;
c:=mod(i-1,9)+1;
r0:=floor((i-1)/27)*3+1;
c0:=floor(mod(i-1,9)/3)*3+1;
--same row
for j in 1..9 loop
n:=(r-1)*9+j;
if bitand(e,power(2,substr(a,n,1)))=0 then
e:=e+power(2,substr(a,n,1));
end if;
end loop;
--same col
for j in 1..9 loop
n:=(j-1)*9+c;
if bitand(e,power(2,substr(a,n,1)))=0 then
e:=e+power(2,substr(a,n,1));
end if;
end loop;
--same blk
for j in 1..9 loop
n:=(r0+floor((j-1)/3)-1)*9+c0+mod(j-1,3);
if bitand(e,power(2,substr(a,n,1)))=0 then
e:=e+power(2,substr(a,n,1));
end if;
end loop;
for m in 1 ..9 loop
if bitand(e,power(2,m))=0 then
--dbms_output.put_line(substr(a,1,i-1)||'('||m||')'||substr(a,i+1));
sd3b(substr(a,1,i-1)||m||substr(a,i+1));
end if;
end loop;
end;
/
exec sd3b('200370009009200007001004002050000800008000900006000040900100500800007600400089001')
284375169639218457571964382152496873348752916796831245967143528813527694425689731
PL/SQL 过程已成功完成。
已用时间: 00: 00: 01.49 |
|