Hướng dẫn giải của IN ĐƯỜNG BIÊN VÒNG TRÒN (IDBVT.CPP)
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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.
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). Hãy tìm và in ra tất cả các số nằm ở phần rìa ngoài cùng (đường biên) của bảng số đó theo thứ tự chạy dọc theo chiều kim đồng hồ, bắt đầu từ ô góc trên cùng bên trái (1,1).
Đầ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ố.
Đầu ra (OUTPUT):
- In ra các số nằm trên đường biên theo đúng thứ tự vòng tròn kim đồng hồ.
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ố chạy từ 1. - Quy trình in đường biên theo chiều kim đồng hồ bao gồm 4 bước liên tiếp:
- Bước 1 (Hàng trên cùng): In các phần tử thuộc hàng 1 từ trái sang phải, từ ô (1,1) đến ô (1,n).
- Bước 2 (Cột bên phải): In các phần tử thuộc cột n từ trên xuống dưới, bắt đầu từ ô (2,n) đến ô (m,n).
- Bước 3 (Hàng dưới cùng): Nếu m > 1, in các phần tử thuộc hàng m từ phải sang trái, từ ô (m,n-1) giảm về ô (m,1).
- Bước 4 (Cột bên trái): Nếu n > 1, in các phần tử thuộc cột 1 từ dưới lên trên, từ ô (m-1,1) giảm về ô (2,1).
3. Độ phức tạp
- Thời gian (Time Complexity): O(m + n) — Duyệt qua các phần tử nằm trên đường biên.
- 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 du lieu mang 2 chieu
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
// 1. In hang 1 tu trai sang phai (tu cot 1 den cot n)
for (int j = 1; j <= n; j++) {
cout << a[1][j] << " ";
}
// 2. In cot n tu tren xuong duoi (tu hang 2 den hang m)
for (int i = 2; i <= m; i++) {
cout << a[i][n] << " ";
}
// 3. In hang m tu phai sang trai (tu cot n-1 ve cot 1)
if (m > 1) {
for (int j = n - 1; j >= 1; j--) {
cout << a[m][j] << " ";
}
}
// 4. In cot 1 tu duoi len tren (tu hang m-1 ve hang 2)
if (n > 1) {
for (int i = m - 1; i >= 2; i--) {
cout << a[i][1] << " ";
}
}
return 0;
}
5. Ví dụ mô phỏng
Input:
4 4
1 6 2 4
6 3 -9 7
-6 5 0 1
0 2 77 1
Quá trình duyệt:
- Bước 1 (Hàng 1): 1 6 2 4
- Bước 2 (Cột 4): 7 1
- Bước 3 (Hàng 4): 1 77 2 0
- Bước 4 (Cột 1): -6 6
Output:
1 6 2 4 7 1 1 77 2 0 -6 6
Đang tải...