|
挑战成功,顺便复习了一把数据结构编程:
DECLARE
TYPE t_s IS TABLE OF VARCHAR2(4000) INDEX BY PLS_INTEGER;
v_s t_s;
TYPE t_n IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
c t_n;
TYPE t_n2 IS TABLE OF t_n INDEX BY PLS_INTEGER;
v_n t_n2;
v_goal NUMBER := 50050;
v_ptr NUMBER;
v_max NUMBER;
p_n NUMBER;
m_n NUMBER;
c_n NUMBER;
d_n NUMBER;
new_n NUMBER;
lvl NUMBER;
v_str VARCHAR2(4000);
BEGIN
c(1):=43;
c(2):=59;
c(3):=100;
v_s(100):='100';
v_n(1)(1):=100;
v_ptr :=1;
v_max :=1;
lvl :=1;
WHILE TRUE LOOP
c_n := v_n(lvl)(v_ptr);
FOR p IN 1..3 LOOP
FOR m IN 1..3 LOOP
IF p<>m THEN
p_n := MOD(TRUNC(c_n/POWER(10,(3-p)*3)),1000);
m_n := MOD(TRUNC(c_n/POWER(10,(3-m)*3)),1000);
IF p_n>0 AND m_n<c(m) THEN
d_n := LEAST(p_n,c(m)-m_n);
p_n := p_n - d_n;
m_n := m_n + d_n;
new_n := (CASE 1 WHEN p THEN p_n WHEN m THEN m_n ELSE TRUNC(c_n/1000000) END)*1000000
+ (CASE 2 WHEN p THEN p_n WHEN m THEN m_n ELSE MOD(TRUNC(c_n/1000),1000) END)*1000
+ (CASE 3 WHEN p THEN p_n WHEN m THEN m_n ELSE MOD(c_n,1000) END);
IF NOT v_s.EXISTS(new_n) THEN
v_s(new_n):=v_s(c_n)||','||new_n;
IF new_n=v_goal THEN
v_str := v_s(new_n);
FOR I in 1..REGEXP_COUNT(v_str,',')+1 LOOP
c_n := REGEXP_SUBSTR(v_str,'[^,]+',1,i);
DBMS_OUTPUT.PUT_LINE(TRUNC(c_n/1000000)||','||MOD(TRUNC(c_n/1000),1000)||','||MOD(c_n,1000));
END LOOP;
-- DBMS_OUTPUT.PUT_LINE(v_s(new_n));
RETURN;
ELSE
v_n(lvl+1)(v_max):=new_n;
v_max := v_max +1;
END IF;
END IF;
END IF;
END IF;
END LOOP;
END LOOP;
IF v_ptr=v_n(lvl).COUNT THEN
lvl := lvl+1;
v_ptr:=1;
v_max :=1;
ELSE
v_ptr := v_ptr +1;
END IF;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('no solution!');
END;
/
0,0,100
43,0,57
0,43,57
43,43,14
27,59,14
27,0,73
0,27,73
43,27,30
11,59,30
11,0,89
0,11,89
43,11,46
0,54,46
43,54,3
38,59,3
38,0,62
0,38,62
43,38,19
22,59,19
22,0,78
0,22,78
43,22,35
6,59,35
6,0,94
0,6,94
43,6,51
0,49,51
43,49,8
33,59,8
33,0,67
0,33,67
43,33,24
17,59,24
17,0,83
0,17,83
43,17,40
1,59,40
1,0,99
0,1,99
43,1,56
0,44,56
43,44,13
28,59,13
28,0,72
0,28,72
43,28,29
12,59,29
12,0,88
0,12,88
43,12,45
0,55,45
43,55,2
39,59,2
39,0,61
0,39,61
43,39,18
23,59,18
23,0,77
0,23,77
43,23,34
7,59,34
7,0,93
0,7,93
43,7,50
0,50,50
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.03
|
|