Sửa code tạo ma phương bậc lẻ

Đề bài nhập n lẻ, sau đó in ra mảng 2 chiều gồm các số từ 1 đến n*n sao cho tổng hàng ngang, hàng dọc, 2 hàng chéo bằng nhau.
Code em test 5; 7; 9; 11… thì ngon nhưng test số 3 lại lỗi. Bác giúp em với

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,i,j,k;
	do
	{
		cout <<"Nhập n lẻ: \n";
		cin >>n;
	}
	while (n%2==0);
	i=n/2;
	j=n/2+1;
	int a[n][n];
	for (k=1;k<=n*n;k++)
	{
		a[i][j]=k;
		if (k%n==0)
		{
			j+=2;
		}
		else
		{
			i--;
			j++;
		}
		if (j>(n-1))
		{
			j=(j%(n-1)-1);
		}
		if (i<0)
		{
			i=n-1;
		}
	}
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++)
		{
			cout <<setw(3);
			cout <<a[i][j]<<" ";
		}
		cout <<endl<<endl;
	}
	return 0;
}

Mấy bác giúp em giải quyết với @DoTran1

bạn tag thẳng tôi vào giúp bạn vừa thấy vinh dự vừa thấy áp lực quá, =))) cũng hạn chế người khác muốn giúp bạn.
Tôi k rõ cách làm của bạn sai chỗ nào, nhưng có lẽ đây là gợi ý cho bạn. Hy vọng tôi giúp ích được cho bạn.
Có thể tối về tôi sẽ code thử.

3 Likes
code bạn tham khảo
for (k=1;k <= n*n; k++)
    	{
    		a[i][j] = k;
    		if(i == 0 && j == (n-1)) {
    			i++;
    			continue;
    		}
    		i--;
    		j++;

    		if (i < 0) {
    			i = n - 1;
    		}
    		if (j > n -1) {
    			j = 0;
    		}
    		if (a[i][j] > 0) {
    			i += 2;
    			j --;
    		}
    	}
Kết quả
 n = 3

 8 1 6
 3 5 7
 4 9 2

 n = 5

 17 24 1 8 15
 23 5 7 14 16
 4 6 13 20 22
 10 12 19 21 3
 11 18 25 2 9

 n = 7

 30 39 48 1 10 19 28
 38 47 7 9 18 27 29
 46 6 8 17 26 35 37
 5 14 16 25 34 36 45
 13 15 24 33 42 44 4
 21 23 32 41 43 3 12
 22 31 40 49 2 11 20

 n = 9

 47 58 69 80 1 12 23 34 45
 57 68 79 9 11 22 33 44 46
 67 78 8 10 21 32 43 54 56
 77 7 18 20 31 42 53 55 66
 6 17 19 30 41 52 63 65 76
 16 27 29 40 51 62 64 75 5
 26 28 39 50 61 72 74 4 15
 36 38 49 60 71 73 3 14 25
 37 48 59 70 81 2 13 24 35

 n = 11

 68 81 94 107 120 1 14 27 40 53 66
 80 93 106 119 11 13 26 39 52 65 67
 92 105 118 10 12 25 38 51 64 77 79
 104 117 9 22 24 37 50 63 76 78 91
 116 8 21 23 36 49 62 75 88 90 103
 7 20 33 35 48 61 74 87 89 102 115
 19 32 34 47 60 73 86 99 101 114 6
 31 44 46 59 72 85 98 100 113 5 18
 43 45 58 71 84 97 110 112 4 17 30
 55 57 70 83 96 109 111 3 16 29 42
 56 69 82 95 108 121 2 15 28 41 54
3 Likes

Em cmt ở 1 topic khác thôi nên mới tag bác vào. Mod hay smod nào đó tách hẳn ra thành 1 topic thôi bác :3

Bạn kiểm tra lại điều kiện kiểm tra này nhé:

Chứ tôi chạy với n = 3 thì khi k = 6, i = 0, j = 2;
Gán a[0, 2] = 6;
tăng j +=2 // j = 4 > n-1
đk if đúng gán j = (4 % (3-1) - 1) = -1;
=> Error.
n = 5, 7 tại sao đúng thì bạn tự kiểm tra lại :smiley:

3 Likes

Bác có cao kiến gì không ạ?
Chứ em suy nghĩ nông cạn chỉ làm được như này thôi :frowning:

If ( n==3 && k==6)
    j=1;
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?