第1题 [问题描述] 下面程序的功能是从键盘读取a,b数组的元素,a,b数组均已从小到大排好序(无相同元素), 现将a,b合并为数组c,同样要求数组c也是从小到大排好序(有相同元素时只保留一个)。 [程序说明] 程序中N表示数组a,b的长度,i,j,k分别表示数组a,b,c的取数或存数的指针。 [程序清单] const n=8; m=2*n; type arr1 = array[1..n] of integer; arr2 = array[1..m] of integer; var a,b:arr1; c: arr2; i, j, k :integer; procedure copy(x:arr1; var y:arr2; var i, j :integer); begin i:=i+1; y[i]:=x[j]; j:=j+1; end; begin for i:=1 to n do read(a[i]); readln; for i:=1 to n do read(b[i]); readln; i:=1;j:=1; ___①___ while ___②___ do if a[i] < b[j] then copy(a, c, k, i) else if b[j] < a[i] then copy(b, c, k, j) else begin copy(a, c, k, i); ___③___ end; while ___④___ do copy(a, c, k, i); while ___⑤___ do copy(b, c, k, j); for i: =1 to k do write(c[i]:4); writeln; end.
第2题 [问题描述] 求一棵树的深度与宽度。 [算法说明] 树可用数组tree:array[1..n,1..5] Of integer; 其中:tree[i,1]表示结点号;tree[i,2]—tree[i,5]所属结点 如右图可表示为: 1 2 3 4 0 (1) 2 5 6 7 0 ┏━━━╋━━━┓ 3 8 0 0 0 (2) (3) (4) 4 9 10 0 0 ┏━━╋━━┓┃ ┣━━┓ 5 0 0 0 0 (5) (6) (7)(8) (9) (10) 6 0 0 0 0 ┣━┓ 7 11 12 0 0 (11) (12) 8 0 0 0 0 ┃ 9 0 0 0 0 (13) 10 0 0 0 0 11 0 0 0 0 在求解的过程中,用到数组g:array[1..n,1..7] of integer; 其中:g[i,1]表示父结点,g[i,2]表示层次, g[i,3]表示本结点号,g[i,4]—g[i,7]表示子女结点; 同时,设2个指针sp1(取数指针),sp2(存数指针) [程序清单] const n = 13; var i, j, k, sp1, sp2, n1, n2, jmax, p:integer; tree: array[1..n,1..5] of integer; g: array[1..n,1..7] of integer; begin for i:=1 to n do begin tree[i, 1]:=i; for j:=2 to 5 do read(tree[i, j] ;readln; end; sp1:=1;sp2:=1; g[1, 1]:=0; g[1,2]:=1; g[1,3]:=1; for i: =4 to 7 do g[1, i]: =tree[1, i-2]; while ___①___ do begin p:=g[sp1, 2]; n2:=g[sp1, 3];___②___; j:=4; while ___③___ do begin n1: =g[sp1, i]; j: =j+1; ___④___; g[sp2, 1]:=n2; g[sp2, 2]: =p; g[sp2, 3]:=n1; for i:=1 to 4 do g[sp2, i+3]:=tree[n1, i+1]; end; ___⑤___; end; writeln('maxd=',g[sp2, 2]); j:=1; k:=g[1, 2];jmax:=O; for i:=2 to sp2 do if ___⑥___ then j:=j+1 else begin if j > jmax then jmax: = j; ___⑦___;k:=g[1, 2]; end; if j > jmax then jmax:=j; writeln('max1=",jmax); end.
第3题 [问题描述] 用生成法求出1,2,…,r的全排列(r<=8)。 [算法说明] 用数组a:arrary[1..r] of integer;表示排列; 初始化时,a[i]:=1(i=1,2,…,r) 设中间的某一个排列为a[1],a[2],…,a[r] 则求出下一个排列的算法为: ①从后面向前找,直到找到一个顺序为止(设下标为j-1,则a[j-1] < a[j]) ②从a[j]-a[r]中,找出一个a[k]比a[j-1]小的最小元素 ③将a[j-1]与a[k]交换 ④将a[j],a[j+1],…,a[r]由小到大顺序。 [程序清单] const r=7; var n,i,s,k,j,i1,t:intger; a:array[1..r] of integer; procedure printl; var ik: integer; begin
for ik:=1 to r do write (a[ik]:8);writeln; end begin for i:=1 to r do ___①___ printl, s:=1; for i:=2 to r do s:=s*i; s:=s-1 for i:=___②___ do begin j:=r; while ___③___ do j:=j-1; k:=j; for il:=j+l to r do if ___④___ then k:=i1; t:=a[j-1]; a[j-1]:=a[k]; a[k]:=t; for i1:=j to r-1 do for k:=i1+1 to r do if ___⑤___ then begin t:=a[i1]; a[i1]:=a[k]; a[k]:=t; end; printl; end; end.
|