โจทย์
กำหนดจำนวนบรรทัด ให้พิมพ์รูปสามเหลี่ยมสองรูปที่สมมาตรกัน โดยสลับตัวอักษร X และ O
ตัวอย่าง (n=5)
X X
O X O X
X O X X O X
X O X O X X O X O X
X O X O
X Xโครงสร้างรูปแบบ
แบ่งเป็น 3 ส่วน:
- ส่วนบน: n-1 บรรทัด (n คี่) หรือ n-2 บรรทัด (n คู่)
- ส่วนกลาง: 1 บรรทัด (n คี่) หรือ 3 บรรทัด (n คู่)
- ส่วนล่าง: n-1 บรรทัด (n คี่) หรือ n-2 บรรทัด (n คู่)
อัลกอริทึม
ใช้ฟังก์ชันช่วย printx(n) พิมพ์ X,O สลับเริ่ม X และ printo(n) เริ่ม O แล้วคำนวณ space และจำนวนตัวอักษรแต่ละบรรทัดตาม parity ของ n
โค้ดภาษา C
#include <stdio.h>
int printx(int n) { // เริ่ม X
for (int i = 1; i <= n; i++)
printf(i % 2 != 0 ? "x " : "o ");
return 0;
}
int printo(int n) { // เริ่ม O
for (int i = 1; i <= n; i++)
printf(i % 2 != 0 ? "o " : "x ");
return 0;
}
int printpattern(int n) {
int x = n, i, j;
if (n % 2 == 0) x = x - 1;
int p = n - 1; // space
int s = 1; // char count
// ส่วนบน
for (i = 1; i <= (x - 1) / 2; i++) {
for (j = 1; j <= p; j++) printf(" ");
if (i % 2 != 0) printx(s); else printo(s);
printf("\n"); p++;
for (j = 1; j <= p; j++) printf(" ");
if (i % 2 != 0) printx(s); else printo(s);
printf("\n"); p--; s++;
}
// ส่วนกลาง
if (n % 2 == 0) {
for (i = 1; i <= p; i++) printf(" ");
if (n % 4 != 0) printx(n/2); else printo(n/2);
printf("\n");
}
if (n % 2 != 0) printx(n);
else {
if (n % 4 != 0) { printx(n/2); printx(n/2); }
else { printx(n/2); printo(n/2); }
}
printf("\n");
// ส่วนล่าง
if (n % 2 == 0) { printf(" "); printx(n/2); printf("\n"); }
p = 1;
if (n % 2 == 0) { x--; p = 2; }
int q = x / 2;
for (i = 1; i <= x; i++) {
for (j = 1; j <= p; j++) printf(" ");
printx(q);
if (i % 2 == 0) q--;
printf("\n"); p++;
}
printf("\n");
return 1;
}
int main() {
int n = 5;
printpattern(n);
return 0;
}ผลลัพธ์
X X
O X O X
X O X X O X
X O X O X X O X O X
X O X O X X O X O X
X O X O
X X