Trong bài toán này, chúng ta được cho một ma trận 2 chiều. Nhiệm vụ là in các phần tử của ma trận theo dạng xoáy ngược kim đồng hồ.
Dạng Xoáy Ngược Kim Đồng Hồ là duyệt xoáy bắt đầu từ góc trên bên trái và đi theo hướng ngược kim đồng hồ: trước xuống dưới, sau sang phải, rồi lên trên, cuối sang trái.

Duyệt ngược kim đồng hồ sẽ cho: 1 5 9 13 14 15 16 12 8 4 3 2 6 10 11 7.
Ví dụ khác:
Đầu vào: 2 4 6 1 7 9 5 0 3 Đầu ra: 2 1 5 0 3 9 7
Để giải quyết, ta sử dụng bốn vòng lặp, mỗi vòng cho một hướng, khởi tạo hướng và duyệt tương ứng.
Ví Dụ
Chương trình minh họa giải pháp:
#include <bits/stdc++.h>
using namespace std;
#define R 3
#define C 3
void printCounterClockwiseSpiral(int m, int n, int matrix[R][C]) {
int i, k = 0, l = 0;
int count = 0;
int total = m * n;
while (k < m && l < n) {
if (count == total) break;
for (i = k; i < m; ++i) {
cout << matrix[i][l] << " ";
count++;
}
l++;
if (count == total) break;
for (i = l; i < n; ++i) {
cout << matrix[m - 1][i] << " ";
count++;
}
m--;
if (count == total) break;
if (k < m) {
for (i = m - 1; i >= k; --i) {
cout << matrix[i][n - 1] << " ";
count++;
}
n--;
}
if (count == total) break;
if (l < n) {
for (i = n - 1; i >= l; --i) {
cout << matrix[k][i] << " ";
count++;
}
k++;
}
}
}
int main() {
int mat[R][C] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
cout << "Duyệt xoáy ngược kim đồng hồ của ma trận:\n";
printCounterClockwiseSpiral(R, C, mat);
return 0;
}
Đầu Ra
Duyệt xoáy ngược kim đồng hồ của ma trận là:
1 4 7 8 9 6 3 2 5