Hướng dẫn giải của BỐN HƯỚNG TỪ TÂM (X, Y) (BHTT.CPP)
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
1. Đề bài tóm tắt
Cho một bảng số kích thước m x n (1 <= m, n <= 1000) và ô tâm có tọa độ (x, y). Hãy in ra các số theo 4 hướng từ ô tâm kéo dài ra tận biên của bảng.
Đầu vào (INPUT):
Dòng 1: Hai số nguyên dương m, n.
m dòng tiếp theo: Mỗi dòng chứa n số nguyên mô tả bảng số.
Dòng cuối cùng: Tọa độ ô tâm x, y (1 <= x <= m; 1 <= y <= n).
Đầu ra (OUTPUT): Gồm 4 dòng:
Dòng 1: Hướng lên trên (từ hàng x-1 về hàng 1 tại cột y).
Dòng 2: Hướng xuống dưới (từ hàng x+1 đến hàng m tại cột y).
Dòng 3: Hướng sang trái (từ cột y-1 về cột 1 tại hàng x).
Dòng 4: Hướng sang phải (từ cột y+1 đến cột n tại hàng x).
2. Phân tích bài toán
Khai báo mảng 2 chiều tĩnh a[1005][1005] với chỉ số bắt đầu từ 1.
Đọc dữ liệu bảng số m x n và tọa độ tâm (x, y).
Duyệt và in 4 hướng lần lượt theo đúng yêu cầu đề bài:
Dòng 1 (Lên trên): Cho biến i chạy từ x - 1 giảm dần về 1, in giá trị a[i][y].
Dòng 2 (Xuống dưới): Cho biến i chạy từ x + 1 tăng dần đến m, in giá trị a[i][y].
Dòng 3 (Sang trái): Cho biến j chạy từ y - 1 giảm dần về 1, in giá trị a[x][j].
Dòng 4 (Sang phải): Cho biến j chạy từ y + 1 tăng dần đến n, in giá trị a[x][j].
3. Độ phức tạp
Thời gian (Time Complexity): O(m + n) — Mỗi hướng duyệt tối đa m hoặc n phần tử.
Không gian (Space Complexity): O(m x n) — Sử dụng mảng 2 chiều tĩnh kích thước tối đa 1005 x 1005.
4. Mã nguồn C++ minh họa
#include <bits/stdc++.h>
using namespace std;
// Khai bao mang 2 chieu tinh voi chi so bat dau tu 1
int a[1005][1005];
int main() {
// Toi uu toc do nhap xuat
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int m, n;
cin >> m >> n;
// Nhap bang so
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
int x, y;
cin >> x >> y;
// Dong 1: Huong len tren (tu hang x-1 giam ve hang 1)
for (int i = x - 1; i >= 1; i--) {
cout << a[i][y] << " ";
}
cout << endl;
// Dong 2: Huong xuong duoi (tu hang x+1 tang den hang m)
for (int i = x + 1; i <= m; i++) {
cout << a[i][y] << " ";
}
cout << endl;
// Dong 3: Huong sang trai (tu cot y-1 giam ve cot 1)
for (int j = y - 1; j >= 1; j--) {
cout << a[x][j] << " ";
}
cout << endl;
// Dong 4: Huong sang phai (tu cot y+1 tang den cot n)
for (int j = y + 1; j <= n; j++) {
cout << a[x][j] << " ";
}
cout << endl;
return 0;
}
5. Ví dụ mô phỏng
Input:
7 6
1 6 2 4 -7 10
6 3 -9 7 2 3
-6 5 0 11 -4 2
0 2 77 1 99 3
-6 5 0 1 4 2
10 2 -3 5 -7 1
1 1 1 1 1 1
3 3
Quá trình xử lý từ ô tâm (3, 3):
Hướng lên trên (cột 3): Hàng 2 (-9) -> Hàng 1 (2) => -9 2
Hướng xuống dưới (cột 3): Hàng 4 (77) -> Hàng 5 (0) -> Hàng 6 (-3) -> Hàng 7 (1) => 77 0 -3 1
Hướng sang trái (hàng 3): Cột 2 (5) -> Cột 1 (-6) => 5 -6
Hướng sang phải (hàng 3): Cột 4 (11) -> Cột 5 (-4) -> Cột 6 (2) => 11 -4 2
Output:
-9 2
77 0 -3 1
5 -6
11 -4 2