diff options
Diffstat (limited to 'others/other')
-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. |