二维离散世界有一种地形叫OIM(OI Mountain)。这种山的坡度只能上升('/')或下降('\'),而且两边的山脚都与地平线等高,山上所有地方都不低于地平线.例如:
是一座OIM;
而 不是OIM。
显然/\的编号为1。但是地理学家在整理纪录是发觉,查找编号与山形的对应关系不是很方便。他们希望能快速地从编号得到山的形状。你自告奋勇答应他们写一个程序,输入编号,能马上输出山形。
输 入:一个编号(编号大小不超过600,000,000),输 出:输入编号所对应的山形,1座山所占行数恰为它的高度,即山顶上不能有多余空行。
输入样例:15
输出样例:
/\ /\
/ \/ \
程 序:
program Program2; const L : integer = 19; SZ : integer = 50; UP : char = '/'; DN : char = '\'; Var i, nth, x, y, h, e, f : integer; m : array[0..1, 0..38, 0..19] of integer; pic : array[0..49, 0..49] of char; procedure init; var k, s, a, b, c : integer; begin for a:=0 to 1 do for b:=0 to 2 * L do for c:=0 to L do m[a, b, c] := 0; m[0, 0, 0] := 1; for k:=0 to 2 * L - 1 do begin for s:=1 to L do begin m[0, k + 1, s] := m[0, k, s + 1] + m[1, k, s + 1]; m[1, k + 1, s] := 1; end; m[0, k + 1, 0] := m[0, k, 1] + m[1, k, 1]; end; end; procedure draw(k, s, nth : integer); begin if (k = 0) then exit; if ((nth - m[1, k, s]) >= 0) then begin nth := nth - m[1, k, s]; if (y > h) then 2; pic[y, x] := UP; y := y + 1; x := x + 1; draw(3); end else begin y := y - 1; pic[y, x] := DN; x := x + 1; draw(k - 1, s - 1, nth); end; end; begin init; read(nth); for e:=0 to SZ - 1 do for f:=0 to SZ - 1 do pic[e, f] := ' '; x := 0; y := 0 h:=0; i := 0; while ((nth - m[0, 2 * i, 0]) >= 0) do begin nth := nth - m[0, 2 * i, 0]; 4; end; draw(5); for i:=h downto x - 1 do begin for e:=0 to x - 1 do write(pic[i, e]); writeln(' '); end; end.