about summary refs log tree commit diff
path: root/others/other
diff options
context:
space:
mode:
Diffstat (limited to 'others/other')
-rw-r--r--others/other/README.md23
-rw-r--r--others/other/spiral.pas70
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.