BCACM11B spoj PTIT – Ma trận xoáy ốc

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.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *