Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCACM11B/
1. Đề bài BCACM11B spoj PTIT
Ma trận xoáy ốc được tạo thành bằng cách điền số 1 vào hàng 1 cột 1, sau đó điền số tăng dần theo chiều kim đồng hồ, ví dụ:
1 | 2 | 3 | 4 | 5 |
16 | 17 | 18 | 19 | 6 |
15 | 24 | 25 | 20 | 7 |
14 | 23 | 22 | 21 | 8 |
13 | 12 | 11 | 10 | 9 |
Hãy viết chương trình cho biết giá trị tại ô (x, y) của 1 ma trận xoáy ốc vuông kích thước n x n.
Input
Dòng đầu tiên ghi số bộ test, không lớn hơn 100. Mỗi bộ test được ghi trên 1 dòng, bao gồm 3 số n x y (1 ≤ n, x, y ≤ 100)
Output
Với mỗi bộ test, in ra giá trị tại ô hàng x cột y trong ma trận xoáy ốc n x n
Example
Input:
2
5 2 3
4 1 2
Output:
18
2
2. code tham khảo BCACM11B spoj PTIT
const fi=''; nmax=100; type data=integer; var f:text; n,x,y:data; test:data; A:array[1..nmax,1..nmax] of data; procedure xuli; var i,tren,duoi,trai,phai:data; gt:data; begin tren:=1; duoi:=n; phai:=n; trai:=1; gt:=0; repeat for i:=trai to phai do begin inc(gt); A[tren,i]:=gt; end; inc(tren); for i:=tren to duoi do begin inc(gt); a[i,phai]:=gt; end; dec(phai); for i:=phai downto trai do begin inc(gt); a[duoi,i]:=gt; end; dec(duoi); for i:= duoi downto tren do begin inc(gt); a[i,trai]:=gt; end; inc(trai); until gt=n*n; writeln(a[x,y]); end; procedure docfile; var i:data; begin assign(f,fi); reset(f); readln(f,test); for i:=1 to test do begin readln(f,n,x,y); xuli; end; close(f); end; begin docfile; end.