In hình chữ nhật có quy luật

INPUT

4 4

OUTPUT

ABCD
BCDA
CDBA
DCBA

Mình cần in ra được hình chữ nhật như trên, nhưng mình code thì mới chỉ ra được dòng đầu. những dòng sau chưa biết làm thế nào. Các bạn chỉ giúp mình với?

  • Bạn đã tìm được quy luật từ ví dụ trên chưa?

  • Bạn đã thử nháp bằng giấy bút trước khi code chưa?

  • Bạn in ra dòng đầu như thế nào khi mà chưa hình dung ra được quy luật của các dòng?

Sai lầm của bạn là chưa hiểu rõ vấn đề mà đã đâm đầu vào code. :smiley:

7 Likes

Bài này thật ra lại rất chi là đơn giản, thay vì đâm đầu vào code như @Sherly1001 đã nói thì chỉ cần suy nghĩ một chút cũng ra. Đây là một gợi ý dành cho bạn: Thử biểu diễn 4 dòng trên thành 4 hình vuông 2x2 như bên dưới và để ý tới vị trí các kí tự.

A B
D C

D A
C B

C D
B A

B C
A D

Mà khoan, cái gần cuối phải là CDAB chứ nhỉ, sao lại là CDBA :thinking: ?

1 Like

Ý bạn là:

ABCD
BCDA
CDAB
DABC

???
Các kí tự dịch phải (xoay vòng) 1 đơn vị sau mỗi dòng.

4 Likes

Mà khoan, nếu input là 4 5 thì dòng đầu tiên là ABCDE hay ABCDA, đề hơi thiếu dữ kiện thì phải :thinking: ?

2 Likes

Quy luật mà mình tìm được (theo ví dụ) là:

  • Ký tự đầu của mỗi dòng được dịch phải (có thể quay lại ký tự đầu nếu đi hết)
  • Với mỗi dòng thì sẽ in ra lần lượt các ký tự bên phải ký tự đầu dòng trước, rồi in ra lần lượt các ký tự bên trái nó.
  • In ra từ gần cho đến xa.
5 Likes

5 x 5
A B C D E
B C D E A
C D E B A
D E C B A
E D C B A

4 x 5
A B C D E
B C D E A
C D E B A
D E C B A

4 x 7
A B C D E F G
B C D E F G A
C D E F G B A
D E F G C B A


Dài dòng và lắm trường hợp quá không viết nữa.
Mọi người nhìn theo tọa độ nhé. Chữ A đầu tiên của dòng đầu tiên em coi là mốc (0 ; 0)
Mọi người so sánh các điểm sau và để ý vị trí nhé. Mỗi trường hợp so sánh em ghi trên 1 dòng

giả sử input 4 , 7 (em coi 4 hàng 7 cột)
(1 ; 0) và (0 ; 1)
(2 ; 0 ) , (1 ; 1 ) , ( 0 ; 2)
(3 ; 0 ) , (2 ; 1 ) , ( 1 ; 0 ) , ( 0 ; 3 )
( 4 ; 0) , ( 3; 1 ) , .....( 1 ; 3) (đến đây là hết vì có 4 hàng thôi)
(5 ; 0) , ....
.... đếm tiếp đến 7 nhé.

Nhìn hết rồi hay mở thẻ này ra đọc nhé.

Thẻ 1

Thấy các điểm này giống nhau không ạ.
Tổng của x và y đều bằng 7 và cũng chứa 1 giá trị của(x , 0)

Tiếp nè

Nãy kết thúc ở ( 3 ; 4) giờ nhìn sang ( 7 ; 1) xong đến (6 ; 2) rồi đến (5 ; 3) thấy A B C đúng không nè. CÒn lại tự nhìn nha. Mỏi tay :confounded:
Thẻ 2

Lập ra cho vui thôi cứ chắc mọi người thấy quy luật rồi!

Em diễn giải hơi khó hiểu thì phải. Chắc không ai hiểu đâu. Viết tay thì được chứ code cho máy run chắc chết.

Chốt câu cuối dễ hiểu nè.

Nhìn theo đường chéo là thấy quy luật để viết tay. (Không chắc code được đâu)

Ai hiểu gì giải thích cho mọi người nữa nha. Em thấy sương sương thế. Hơi mất thời gian nhưng mọi người đã bị mất 2p lãng phí của cuộc đời. Cảm ơn mọi người.
Ai đọc không hiểu cũng không sao đâu vì em còn không biết em viết gì.
Lẽ ra reply topic nhưng nhầm sang anh Gà Coder (@HR16 ) mà giờ ko sửa được.

2 Likes

Chơi kiểu magic. :upside_down_face:

Magic
def sher(row, col):
    def magic(i, j):
        i %= col

        if 0 == i: return j
        if 0 == j: return i
        if i + j < col: return i + j
        else: return col - j - 1

    for i in range(row):
        for j in range(col):
            print(chr(65 + magic(i, j)), end = '')
        print()

sher(8, 6)
ABCDEF
BCDEFA
CDEFBA
DEFCBA
EFDCBA
FEDCBA
ABCDEF
BCDEFA

P/S: Cũng không hiểu Nguyên đang nói gì luôn. :V :V

6 Likes

Thôi kệ đi. Cái cách hiểu của em nó cứ lằng nhằng sao ấy( tự thấy nhiều lúc hơi hơi ngáo :stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye:). Hiểu theo quy luật của Sherly dễ hơn nhiều :grin:

1 Like
import string
letters = list(string.ascii_uppercase)


colums = 9
rows = 5
count = 0

for i in range (1, rows+1):

    for j in range(colums):
        print(letters[j+count], end='')

    count = count + 1
    print('')

Output:

ABCDEFGHI
BCDEFGHIJ
CDEFGHIJK
DEFGHIJKL
EFGHIJKLM
[Finished in 0.4s]

Code này bị giới hạn bởi số lượng chữ cái alphabe (không tự quay lại A khi đã đến Z), nhưng vì đề bài không nói rõ nên chắc không sao :smiley:

2 Likes

Cái output sai sai hay sao ấy ạ

2 Likes

À, bạn nói mình mới coi kỹ, sai quá sai, sorry làm sai đề bài, để lát có thời gian mình sửa lại :slight_smile:

3 Likes
import string
letters = list(string.ascii_uppercase)

rows = 4
columns = 4

row = letters[:columns]

for i in range(1, rows+1):
    print(''.join(row))
    row.append(row.pop(row.index(row[0])))

ABCD
BCDA
CDAB
DABC
[Finished in 0.5s]

Theo logic mình hiểu thì mỗi lần xuống dòng thì ký tự đầu tiên sẽ được đem xuống cuối, và cứ xoay vòng như vậy, nhưng đề bài thì không theo logic này, nên cũng không chắc.

2 Likes

Do em cũng không biết giải thích kiểu gì nên viết code cho mọi người dễ hiểu. Đề bài của chủ thớt là đúng chứ không sai đâu ạ.
Code em code bằng C++ theo cách em lý giải bên trên ạ(đừng xem lại vì em còn không hiểu ):

#include <iostream>
#include <iomanip>

using namespace std;

void draw(int r , int c){
    for(int i = 0; i < r ; i++){
        for(int j = 0 ; j < c ;j++){

            if(i + j < c)   cout << setw(2) << (char) (65 + i + j)  ;
            else cout << setw(2) << (char) (65 + c - j - 1) ;

        }
        cout << endl;
    }
}

int main(){
    int r = 4 , c = 7 ;

    draw(r , c);

    return 0;
}

Kết quả đây ạ

Input : 4 7

Output : 
 A B C D E F G
 B C D E F G A
 C D E F G B A
 D E F G C B A

Process returned 0 (0x0)   execution time : 0.017 s

Mọi người xem và góp ý giúp em. Cảm ơn mọi người đã đọc.
P/s: Rộn ràng quá mà chưa thấy chủ thớt phản hồi gì

2 Likes

Chắc logic là thế này

1 2 3 4 5
2 3 4 5 1
3 4 5 2 1
4 5 3 2 1
5 4 3 2 1

Diễn đạt bằng số sẽ dễ nhìn hơn

4 Likes

Nguyên code v là ngon r, thêm xử lý trường hợp r > c nữa là ok.

Còn nếu thích thì phá vòng for bên trong với if else thành 2 vòng for luôn. :upside_down_face:


P/S: mình nói quy luật ở trên r mà hình như hông ai đọc. :frowning:

4 Likes

Em có đọc và em đang thử code tiếp nè nhưng cái việc viết ngược CBA thay vì ABC thì em đang nghĩ tiếp. Code bằng đt nên chậm dã man🤦 đã thế complier còn bị ngáo nữa

1 Like

Dùng phone thì mình recommend cái c4doird này nè.

Trc chưa có máy mình cũng code chay bằng cái này á. :kissing:

3 Likes

Cái c4droid đấy là cái trả phí hay sao ấy. Em mới lớp 11 làm gì có tiền trả bản full còn cài bản crack thì hơi sao sao ấy. Cài nãy giờ tải cả complier về rồi mà vẫn báo không có complier. Kệ đi.
Code theo idea của @Sherly1001 đây nha. Giờ em mới được động vào máy tính (khổ thân tui học hành mà còn phải học trộm :sob: :sob: )
Lưu ý đây là code của C++. Em mới học có C với C++ thôi nên bác nào cần thì dịch ra thuật toán rồi tự code nha.
Input c phải nhỏ hơn or bằng 26

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

void draw(int r , int c , string a){
    for(int i = 0 ; i < r ; i++){
        
        int pos = i % r;
        
        for(int j = pos ; j < c ; j++)
			cout << setw(3) << a.at(j);
			
        for(int j = pos - 1 ; j >= 0 ; j--)
        	cout << setw(3) << a.at(j);
        	
        cout << endl;
        
    }
}

int main(){
    int r = 4 , c = 7;

    string letters;

    for(int i = 0 ; i < c ; i++){
        letters.push_back((char) (65 + i ));
    }

    draw(r , c , letters);

    return 0;
}
Input 
4 7
Output 
  A  B  C  D  E  F  G
  B  C  D  E  F  G  A
  C  D  E  F  G  B  A
  D  E  F  G  C  B  A

--------------------------------
Process exited after 0.03347 seconds with return value 0
Press any key to continue . . .

Mọi người xem và còn chỗ nào chưa được thì bảo để em sửa nha.

Sửa lại code bên trên của em theo góp ý của Sherly nha
#include <iostream>
#include <iomanip>

using namespace std;


void draw(int r , int c){
    for(int i = 0; i < r ; i++){
        for(int j = 0 ; j < c ;j++){
			int tmp = i % c;
            if(tmp + j < c)   cout << setw(2) << (char) (65 + tmp + j)  ;
            else cout << setw(2) << (char) (65 + c - j - 1) ;
			
        }
        cout << endl;
    }
}

int main(){
    int r = 7 , c = 4;

    draw(r , c );

    return 0;
}

Kết quả đây ạ:

Input 
7 4
Output
 A B C D
 B C D A
 C D B A
 D C B A
 A B C D
 B C D A
 C D B A

--------------------------------
Process exited after 0.03832 seconds with return value 0
Press any key to continue . . .

Cảm ơn mọi người đã đọc.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?