okviri.cpp

Bài toán

Trang trí một xâu kí tự theo cách sau đây. Thông thường các kí tự sẽ được bao quanh bằng khung dấu thăng.

..#..

.#.#.

#.X.#

.#.#.

..#..

Cứ ba kí tự thì ta sẽ dùng khung dấu sao. Khung dấu sao nếu có thì luôn đặt bên trên khung dấu thăng.

..*..

.*.*.

*.X.*

.*.*.

..*..

Hãy trang trí xâu kí tự để có kết quả như ví dụ dưới đây.

Ví dụ

ABCD

Kết quả cần in ra là

..#...#...*...#..

.#.#.#.#.*.*.#.#.

#.A.#.B.*.C.*.D.#

.#.#.#.#.*.*.#.#.

..#...#...*...#..

Input: Một xâu kí tự chỉ gồm chữ in hoa và dài không quá 15 kí tự.

Output: 5 dòng thể hiện xâu sau khi được trang trí.

Code này của Nguyễn Tiến Trung Kiên

#include <stdio.h>

char s[12309];

main(){

    int i;

    scanf("%s", s);

    printf("."); for (i=0; s[i]; i++) printf(i%3==2 ? ".*.." : ".#.."); printf("\n");

    printf("."); for (i=0; s[i]; i++) printf(i%3==2 ? "*.*." : "#.#."); printf("\n");

    printf("#");

    for (i=0; s[i]; i++) {

        printf(".%c.", s[i]);

        if (i%3==1 && s[i+1]) printf("*");

        else if (i%3==2) printf("*");

        else printf("#");

    }

    printf("\n");

    printf("."); for (i=0; s[i]; i++) printf(i%3==2 ? "*.*." : "#.#."); printf("\n");

    printf("."); for (i=0; s[i]; i++) printf(i%3==2 ? ".*.." : ".#.."); printf("\n");

}

Các lỗi thường gặp

Wrong answer

- Do viết sai điều kiện. Điều kiện để in ra dấu * ở dòng thứ 3 phải là (i mod 3 = 1 và length(s)>i) hoặc (i mod 3 = 2). Một số bạn quên không kiểm tra điều kiện length(s)>i.