Printing patterns using loops, hay in pattern (mẫu) sử dụng vòng lặp là một dạng bài tập rất phổ biến để rèn luyện tư duy logic khi bắt đầu học kỹ thuật lập trình. Các bài tập kinh điển của dạng này có thể kể đến: Vẽ tam giác, hình thoi bằng ký tự *... Ở đây, tôi xin gửi tới các bạn một bài tập mà theo tôi là có thể giúp phân loại khả năng tư duy của lập trình viên rất hay.
Đề bài:
Nhập vào một số nguyên dương n bất kỳ trong khoảng từ 2 tới 10. In ra hình vuông có kích thước 2 * n - 1 với tâm chính giữa là số 1, các số khác tăng dần từ trong ra ngoài.
Ví dụ: Với n=5, tôi được hình như sau:
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5
Hoặc với n=7, tôi được hình như sau:
7 7 7 7 7 7 7 7 7 7 7 7 7
7 6 6 6 6 6 6 6 6 6 6 6 7
7 6 5 5 5 5 5 5 5 5 5 6 7
7 6 5 4 4 4 4 4 4 4 5 6 7
7 6 5 4 3 3 3 3 3 4 5 6 7
7 6 5 4 3 2 2 2 3 4 5 6 7
7 6 5 4 3 2 1 2 3 4 5 6 7
7 6 5 4 3 2 2 2 3 4 5 6 7
7 6 5 4 3 3 3 3 3 4 5 6 7
7 6 5 4 4 4 4 4 4 4 5 6 7
7 6 5 5 5 5 5 5 5 5 5 6 7
7 6 6 6 6 6 6 6 6 6 6 6 7
7 7 7 7 7 7 7 7 7 7 7 7 7
Trước khi xem cài đặt bằng C của chương trình, hãy cố gắng tự tìm ra đáp án nhé.
Đây là cách giải của tôi, nhìn hơi stupid cơ mà ít nhất cũng chạy được đúng kết quả:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < 2 * n - 1; i++, putchar('\n'))
for (int j = 0; j < 2 * n - 1; j++) {
if (i < n) {
if (j >= i && j < 2 * n - 1 - i)
printf("%d ", n - i);
else
n > j ? printf("%d ", n - j) : printf("%d ", j - n + 2);
} else {
if (j >= 2 * n - i - 2 && j <= i)
printf("%d ", i - n + 2);
else
n > j ? printf("%d ", n - j) : printf("%d ", j - n + 2);
}
}
return 0;
}
Còn đây là cách giải của các "thiên tài" trên HackerRank:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int len = n * 2 - 1;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
int min = i < j ? i : j; // 1
min = min < len-i ? min : len-i-1;
min = min < len-j ? min : len-j-1;
printf("%d ", n-min);
}
printf("\n");
}
return 0;
}