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.