PDA

View Full Version : Đề thi HSG



hoasentrang_cm
25-04-2014, 19:49
Bài 3: (6 điểm) Cho một bảng ô vuông A gồm n cột, n hàng. Từ ô vuông cột 1, hàng 1 người ta điền vào mỗi ô vuông đúng một con số tự nhiên bắt đầu từ 1 liên tiếp đến n2 theo chiều từ trái sang phải và từ trên xuống dưới. Với số tự nhiên k, m cho trước ta biến đổi bảng ô vuông A thành bảng ô vuông B bằng cách dời tất cả các hàng lên trên k hàng, rồi tiếp tục dời tất cả các cột sang trái m cột. Khi dời hàng đến hàng đầu nếu tiếp tục dời thì thành hàng cuối, tương tự cho dời cột..
Yêu cầu: Viết chương trình nhập số tự nhiên n, k, m, i, j, h
a) Xuất ra màn hình con số của ô vuông cột i hàng j của bảng B
b) Xuất ra màn hình chỉ số hàng và cột của ô vuông trong bảng B có giá trị là h.
Ví dụ: Với n=5, k=7, m=6, i=4, j=3, h=25
Bảng A ban đầu
Cột 1 2 3 4 5
Hàng
1 11 2 3 4 5
2 6 7 8 9 10
3 11 12 13 14 15
4 16 17 18 19 20
5 21 22 23 24 25
k=7
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
1 2 3 4 5
6 7 8 9 10

m= 6
12 13 14 15 11
17 18 19 20 16
22 23 24 25 21
2 3 4 5 1
7 8 9 10 6

hoasentrang_cm
07-05-2014, 09:39
Mình mới tìm ra cách dời k hàng: khi đó hàng i của bảng B sẽ tương ứng với hàng (i+k) mod N +1 của bảng A
P/s: các bạn kiểm tra xem mình nghĩ thế có đúng không nhé!

auauau97
23-07-2014, 16:39
Mình thì làm trâu bò kiểu này ra cơ mà tốc độ với n lớn chắc ko cao

Uses crt;
Const MAX=100;
Type
mang=array[1..MAX] of integer;
Var
a: array[1..MAX,1..MAX] of integer;
temp,last : mang;
n,m,k: integer;
i,j,dem: integer;

Procedure Inra;
Var
i,j: integer;
Begin
For i:=1 to n do
Begin
For j:=1 to n do Write(a[i][j],' ');
Writeln;
End;
Writeln;
End;

Procedure GanHang(var t:mang; v: integer);
Var i: integer;
Begin
For i:=1 to n do t[i]:=a[v][i];
End;

Procedure GanCot(var t:mang; v: integer);
Var i: integer;
Begin
For i:=1 to n do t[i]:=a[i][v];
End;

Procedure DoiHang(x: integer);
Var
j,y: integer;
Begin
If x=1 then y:=n
Else y:=x-1;
GanHang(temp, x);
For j:=1 to n do
a[y][j]:=temp[j];
End;

Procedure DoiCot(x: integer);
Var
i,y: integer;
Begin
If x=1 then y:=n
Else y:=x-1;
GanCot(temp, x);
For i:=1 to n do
a[i][y]:=temp[i];
End;


BEGIN
Clrscr;
// Write('Nhap n, m ,k: '); Readln(n,m,k);
n:=10; m:=6; k:=7; dem:=0;
For i:=1 to n do
For j:=1 to n do
Begin
dem+=1;
a[i][j]:=dem;
End;
Inra;
Writeln('k = ',k);
For j:=1 to k do
Begin
GanHang(last,n);
For i:=1 to n-1 do DoiHang(i);
For i:=1 to n do a[n-1][i]:=last[i];
End;
Inra;
Writeln('m = ',m);
For i:=1 to m do
Begin
GanCot(last,n);
For j:=1 to n-1 do DoiCot(j);
For j:=1 to n do a[j][n-1]:=last[j];
End;
Inra;
END.