Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Tạo hình vuông kỳ diệu trong lập trình C

  1. #1
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Mặc định Tạo hình vuông kỳ diệu trong lập trình C

    Hình vuông kỳ diệu là ma trận vuông n*n,trong đó các số tự nhiên từ 1,2...n*n xuất hiện đúng 1 lần và tổng trên các cột,hàng và đường chéo đều bằng nhau.Ví dụ,hình vuông 5x5 này có tổng là 65.Mọi người có ý tưởng nào tạo hình vuôn này thì góp ý cho mình với.
    Cánh Chym ứ mỏi

  2. #2
    Ngày gia nhập
    03 2008
    Bài viết
    126

    cho cái vd đi bạn
    cái gì cũng phải cho cái vd mới hình dung dc chứ

  3. #3
    Ngày gia nhập
    03 2008
    Bài viết
    78

    - Có nghĩa là một ma trận vuông mới có tính chất P jì đó...ng ta gọi đó là một ma phương.Ở đây là tổng hàng = tổng cột = tổng chéo chính = tổng chéo phụ.

    - Trên diễn đàn này có một topic về cái này:hình như tên là" Các thuật giải ngẫu hứng hay sao đó?"Nhưng chỉ nói về phương pháp thôi.
    - Mình có code thử dựa theo ý tưởng đó và bạn tham khảo nhé....

    C Code:
    1. #include <stdio.h>
    2. void taomaphuong(int a[][10],int n)
    3. {
    4.     //Dien so 1
    5.     a[n/2][n/2+1] = 1;
    6.     int k = 1;
    7.     int i = n/2 ;
    8.     int j = n/2 + 1;
    9.     while (k<n*n)
    10.     {
    11.         int ok = 0;
    12.         k = k + 1;
    13.         //Truong hop o bien tren
    14.         if (i==0&&k%n!=1&&ok==0)
    15.         {
    16.             i = n - 1;
    17.             a[i][j+1] = k;
    18.             j = j + 1;
    19.             ok = 1;
    20.         }
    21.         if (j==n-1&&k%n!=1&&ok==0)
    22.         {
    23.             j = 0;
    24.             a[i-1][j] = k;
    25.             i = i - 1;
    26.             ok=1;
    27.         }
    28.         if (k%n==1&&ok==0)
    29.         {
    30.             j =(j + 2)%n;
    31.             a[i][j] = k;
    32.             ok=1;
    33.         }
    34.         if (ok==0)
    35.         {
    36.             i=i-1;
    37.             j=j+1;
    38.             a[i][j]=k;
    39.        
    40.         }
    41.     }
    42. }
    43. void xuat(int a[][10],int n)
    44. {
    45.     for(int i=0;i<n;i++)
    46.     {
    47.         for(int j=0;j<n;j++)
    48.         {
    49.             printf("%d  ",a[i][j]);
    50.         }
    51.         printf("\n");
    52.     }
    53. }
    54. void main()
    55. {
    56.     int array[10][10]={(0,0)},n;
    57.     printf("Nhap n ");
    58.     scanf("%d",&n);
    59.     taomaphuong(array,n);
    60.     xuat(array,n);
    61. }
    No way, No success..

  4. #4
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Xin lỗi bạn nhé.lúc nãy insert cái ảnh nhầm mất.Ví dụ như cái hình vuông trong hình sau,tổng các hảng,cột,đường chéo đều là 65
    Cánh Chym ứ mỏi

  5. #5
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Trích dẫn Nguyên bản được gửi bởi hacker_mubaohiem Xem bài viết
    - Có nghĩa là một ma trận vuông mới có tính chất P jì đó...ng ta gọi đó là một ma phương.Ở đây là tổng hàng = tổng cột = tổng chéo chính = tổng chéo phụ.

    - Trên diễn đàn này có một topic về cái này:hình như tên là" Các thuật giải ngẫu hứng hay sao đó?"Nhưng chỉ nói về phương pháp thôi.
    - Mình có code thử dựa theo ý tưởng đó và bạn tham khảo nhé....

    C Code:
    1. #include <stdio.h>
    2. void taomaphuong(int a[][10],int n)
    3. {
    4.     //Dien so 1
    5.     a[n/2][n/2+1] = 1;
    6.     int k = 1;
    7.     int i = n/2 ;
    8.     int j = n/2 + 1;
    9.     while (k<n*n)
    10.     {
    11.         int ok = 0;
    12.         k = k + 1;
    13.         //Truong hop o bien tren
    14.         if (i==0&&k%n!=1&&ok==0)
    15.         {
    16.             i = n - 1;
    17.             a[i][j+1] = k;
    18.             j = j + 1;
    19.             ok = 1;
    20.         }
    21.         if (j==n-1&&k%n!=1&&ok==0)
    22.         {
    23.             j = 0;
    24.             a[i-1][j] = k;
    25.             i = i - 1;
    26.             ok=1;
    27.         }
    28.         if (k%n==1&&ok==0)
    29.         {
    30.             j =(j + 2)%n;
    31.             a[i][j] = k;
    32.             ok=1;
    33.         }
    34.         if (ok==0)
    35.         {
    36.             i=i-1;
    37.             j=j+1;
    38.             a[i][j]=k;
    39.        
    40.         }
    41.     }
    42. }
    43. void xuat(int a[][10],int n)
    44. {
    45.     for(int i=0;i<n;i++)
    46.     {
    47.         for(int j=0;j<n;j++)
    48.         {
    49.             printf("%d  ",a[i][j]);
    50.         }
    51.         printf("\n");
    52.     }
    53. }
    54. void main()
    55. {
    56.     int array[10][10]={(0,0)},n;
    57.     printf("Nhap n ");
    58.     scanf("%d",&n);
    59.     taomaphuong(array,n);
    60.     xuat(array,n);
    61. }
    Tớ thử với n=4 không thỏa mãn bạn ạ.
    Cánh Chym ứ mỏi

  6. #6
    Ngày gia nhập
    03 2008
    Bài viết
    78

    Mặc định Tạo hình vuông kỳ diệu trong lập trình C

    Trích dẫn Nguyên bản được gửi bởi dieucay555
    Tớ thử với n=4 không thỏa mãn bạn ạ.
    - Đúng rùi tớ wên nói với cậu...Với ma trận cấp chẵn thì ko bao jờ có ma phương kiểu đó đc.Trong bài viết trên diễn đàn này mà tớ nói đó.Cũng đề cập đến chuyện đó...Cậu search thử nhé!
    No way, No success..

  7. #7
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Híc,tớ cũng đã viết được với n lẻ,còn n chẵn thì sao nhỉ?có ai có ý tưởng gì không?
    Cánh Chym ứ mỏi

  8. #8
    Ngày gia nhập
    02 2008
    Bài viết
    9

    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #define max 100
    4. int n=6,d,c,k=1;
    5. int i,j;
    6. int a[max][max];
    7.  
    8. void chuanbi_le()
    9. {
    10.     d=(n+1)/2+1;
    11.     c=(n+1)/2;
    12.     k=1;
    13.     for (i=1;i<=n;i++)
    14. for (j=1;j<=n;j++)
    15. a[i][j]=0;
    16. a[d][c]=k;
    17. }
    18. void n_le() // ma tran ky ao voi n le
    19. { chuanbi_le();
    20. while (k<n*n)
    21. {
    22. d++;
    23. if (d>n) d=1;
    24. c++;
    25. if (c>n) c=1;
    26. if (a[d][c]!=0)
    27. do
    28. { d++;
    29. if (d>n) d=1;
    30. c--;
    31. if (c<1) c=n;
    32. } while (a[d][c]!=0);
    33. k++;
    34. a[d][c]=k;
    35. }
    36. }
    37. void inMT() // In ma tran
    38. {
    39. clrscr();
    40. for (i=1;i<=n;i++)
    41. { for (j=1;j<=n;j++)
    42. printf("%4d",a[i][j]);
    43. printf("\n");
    44. }
    45. printf("\n Tong moi dong, moi cot, moi duong cheo =%d",(1+n*n)*n/2);
    46. }
    47.  
    48. void doicho(int &a, int &b)
    49. { int t;
    50. t=a;a=b;b=t;
    51. }
    52.  
    53. void chuanbi_chan()
    54. { k=1;
    55. for (i=1;i<=n;i++)
    56. for (j=1;j<=n;j++)
    57. { a[i][j]=k;
    58. k++;}
    59. }
    60.  
    61. int laycot (int c)
    62. {
    63. return ((c>n/2)?c-n/2:c);
    64. }
    65.  
    66. void n_chan()
    67. { chuanbi_chan();
    68. for (i=1; i<=n/2; i++)
    69. { for (j=i; j<=i+n/4-1; j++)
    70. {
    71. d=i;c=j;
    72. c=laycot(c);
    73. doicho(a[i][c],a[n-i+1][n-c+1]);
    74. doicho(a[n-i+1][c],a[i][n-c+1]);
    75. }
    76. if ((n/2)%2!=0)
    77. {
    78. c=laycot(c+1);
    79. doicho(a[i][c],a[i][n-c+1]);
    80. c=laycot(c+1);
    81. doicho(a[i][c],a[n-i+1][c]);
    82. }
    83. }
    84. }
    85.  
    86. void main()
    87. {
    88. clrscr();
    89. printf("\n Chuong trinh tao ma tran ky ao\n");
    90. printf("\n Nhap kich thuoc ma tran n=");
    91. scanf("%d",&n);
    92. if (n%2==0)
    93. n_chan();
    94. else
    95. n_le();
    96. inMT();
    97. getch();
    98.  
    99. }
    đó là bài hình vuông có số chẵn lun đó bạn

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn