diff options
author | Raphael McSinyx <vn.mcsinyx@gmail.com> | 2017-02-16 21:59:09 +0700 |
---|---|---|
committer | Raphael McSinyx <vn.mcsinyx@gmail.com> | 2017-02-16 21:59:09 +0700 |
commit | fed71ad5b9c7e3524931b939ec369a559cf2b0b9 (patch) | |
tree | bcec2b6222af87088a6066524ebd0bcfebcbf2b8 /others | |
parent | 5a44eb260b9b35096df7371a702ba99b7265b3f9 (diff) | |
download | cp-fed71ad5b9c7e3524931b939ec369a559cf2b0b9.tar.gz |
Add others/other/spiral.pas
Diffstat (limited to 'others')
-rw-r--r-- | others/other/README.md | 23 | ||||
-rw-r--r-- | others/other/spiral.pas | 70 |
2 files changed, 93 insertions, 0 deletions
diff --git a/others/other/README.md b/others/other/README.md index 8126221..067ea64 100644 --- a/others/other/README.md +++ b/others/other/README.md @@ -200,6 +200,29 @@ Tệp `FDP.OUT` gồm một dòng duy nhất ghi số tự nhiên k. | 10 10 | 2 | | 100 15 | 24 | +## Vòng xoắn số nguyên + +Cho số nguyên dương n. Viết các số từ 1 đến n theo hình xoắn trôn ốc chữ nhật +nằm ngang vuông nhất có thể. + +### Dữ liệu + +Tệp `SPIRAL.INP` gồm một dòng duy nhất ghi số nguyên dương n. + +### Kết quả + +Tệp `SPIRAL.OUT` ghi vòng xoắn trôn ốc. + +### Giới hạn + +n ≤ 10<sup>6</sup>. + +### Ví dụ + +| SPIRAL.INP | SPIRAL.OUT | +| ---------- | -------------------------------- | +| 12 | 1 2 3 4<br>10 11 12 5<br>9 8 7 6 | + ## Từ điển Cho một từ điển gồm n từ w. Với q truy vấn, mỗi truy vấn đưa ra một xâu s, đếm diff --git a/others/other/spiral.pas b/others/other/spiral.pas new file mode 100644 index 0000000..3f8fc57 --- /dev/null +++ b/others/other/spiral.pas @@ -0,0 +1,70 @@ +uses sysutils; + +const + direction: array[0..3, 0..1] of int8 = ((0, 1), (1, 0), (0, -1), (-1, 0)); + +var + f: text; + n, i: int32; + m, x, y: int16; + d: int8 = 0; + a: array of array of int32; + +function mt(x, y: int16): boolean; + begin + if (x < 0) or (y < 0) then + exit(false); + if (x >= m) or (y >= n) then + exit(false); + if a[x][y] > 0 then + exit(false); + mt := true + end; + +function rjust(i: int32; len: int8): string; + begin + rjust := inttostr(i); + while length(rjust) < len do + rjust := ' ' + rjust + end; + +begin + assign(f, 'SPIRAL.INP'); + reset(f); + readln(f, n); + for m := trunc(sqrt(n)) downto 1 do + if n mod m = 0 then + begin + n := n div m; + break + end; + close(f); + + setlength(a, m); + for x := m - 1 downto 0 do + begin + setlength(a[x], n); + for y := n - 1 downto 0 do + a[x][y] := 0 + end; + + for i := 1 to m * n do + begin + a[x][y] := i; + if not mt(x + direction[d][0], y + direction[d][1]) then + d := succ(d) mod 4; + inc(x, direction[d][0]); + inc(y, direction[d][1]) + end; + + assign(f, 'SPIRAL.OUT'); + rewrite(f); + d := length(inttostr(m * n)); + for x := 0 to m - 1 do + begin + for y := 0 to n - 2 do + write(f, rjust(a[x][y], d), ' '); + writeln(f, rjust(a[x][n - 1], d)) + end; + close(f) +end. |