Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 23 kết quả

Đề tài: Bài tập C | Ma trận xoắn chôn ốc trong C

  1. #1
    Ngày gia nhập
    03 2007
    Nơi ở
    TP ho chi minh
    Bài viết
    3

    Smile Bài tập C | Ma trận xoắn chôn ốc trong C

    DE bai la :
    nhap vao hang , cot mang hai chieu:
    in ra man hinh ma tran xoay
    VD : m=4,n=5
    1 2 3 4 5
    14 15 16 17 6
    13 20 19 18 7
    12 11 10 9 8
    THANKS NHIEU LAM!!
    "HOC!HOC NUA ! HOC MAI"

  2. #2
    No Avatar
    Leon88 Khách

    Dạo này cũng ko rãnh để làm code nên mình đưa ra 1 gợi ý bạn thử làm theo nha .
    Dùng 4 biến a1,a2,a3,a4 để đánh dấu, a1 là hàng từ trên xuống (giá trị ban đầu là 1) a4 là hàng từ dưới lên (có giá trị là m) a2 là cột (có giá trị từ 1 đến n) a3 là cột (có giá trị từ n về 1). Xử dụng vòng lập while để tính số phần tử
    trong khi chưa bỏ lỗ hết thì vòng lập thực hiện . Bên trong while thì có 4 dòng for ... vòng for 1 là để ghi giá trị từ hàng a1 (trái sang phải) vòng for 2 để ghi giá trị từ cột a3 (trên xuống dưới) vòng for 3 để ghi giá trị của hàng a4 (từ phải về trái) vòng for 4 để ghi giá trị của cột (a2 từ dưới lên) Sau 1 lần lập thì a1,a2 tăng 1, a3,a4 giảm 1. Vòng lập while cứ lập đi lập lại đến khi số phần tử = m*n .

    Bạn thử làm theo cách này nếu ko dc thì mình làm code dùm cho

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Cách giải tổng quát cho các bài sắp xếp ma trận liên tiếp : đặt 4 vị trí biên, và tăng giảm theo cường độ. Cứ như vậy mà sắp xếp.
    None!

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Bài này tui đã có giải rồi, tìm các bài viết của tui trong forum là thấy à.

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Uhm ! Mấy bài ma trận thì cách giải đó là chính qui nhất rồi . Nhưng kidkid đã từng giải thế này !
    Để in ma trận xoáy như tampointer đã đề cập thì đầu tiên kidkid viết hàm vẽvòng ở bên ngoài, sau đó gọi lại chính hàm đó với vòng ở bên trong . Nói thì có vẻ khác nhưng thật ra thì cũng giống cách của anh em

  6. #6
    Ngày gia nhập
    02 2007
    Bài viết
    27

    Mặc định Bài tập C | Ma trận xoắn chôn ốc trong C

    Các pác check giùm cái ạ, kết quả thì đúng, còn thuật giải em sợ chưa tối ưu
    Code:
    #include <stdio.h>
    #include <conio.h>
    #define row 5
    #define col 5
    
    void main()
    {
    	int a[row][col];
    	int value=1,hangTren=0,hangDuoi=row-1,cotTrai=0,cotPhai=col-1;
    	clrscr();
    	while(value<=row*col)
    		{
    		  for(int i=cotTrai;(i<=cotPhai)&&(value<=row*col);i++,value++)
    			 a[hangTren][i]=value;
    
    		  hangTren++;
    
    		  for(int j=hangTren;(j<=hangDuoi)&&(value<=row*col);j++,value++)
    			 a[j][cotPhai]=value;
    		  cotPhai--;
    
    		  for(int k=cotPhai;(k>=cotTrai)&&(value<=row*col);k--,value++)
    			 a[hangDuoi][k]=value;
    		  hangDuoi--;
    
    		  for(int h=hangDuoi;(h>=hangTren)&&(value<=row*col);h--,value++)
    			 a[h][cotTrai]=value;
    		  cotTrai++;
    		}
    	for(int i=0;i<row;i++)
    		{
    		  for(int j=0;j<col;j++)
    			 printf("%3.d ",a[i][j]);
    		  printf("\n");
    		}
    	getch();
    }


    Tucõi phước
    Tìnhdây oan

  7. #7
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Pete sửa lại một tí nhé :
    * Định nghĩa Constant thì UpperCase nhé : : #define ROW 5
    * Chỉ cần 2 biến đếm là đủ : col , row không cần thiết đến 4 cái i,j,k,h
    * Điều kiện for thừa nhiều, code hơi phức tạp. Đơn giản hóa thế này :
    Code:
                     for(int scan=cotTrai;scan<=cotPhai;)
    			 a[hangTren++][i++]=value++;
    còn lại tương tự.
    Tại sao không cần check điều kiện value ? Đơn giản là vì, cậu scan từng ô rồi gán lần lượt giá trị, tức là giá trị value đi kèm theo mỗi lần quét. Nếu cậu quét đúng vị trí thì value tất nhiên sẽ đúng.
    None!

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Bài này tui đã post 1 lần rồi, giờ post lại cho rõ ràng:
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3. #include <cstdlib>
    4. #define maxx 25
    5. using namespace std;
    6. int main(){
    7.     srand(time(0));
    8.     int b[maxx*maxx],a[maxx][maxx],i,j,n = 10;
    9.     for (i = 0;i < n*n;++i) b[i] = rand()%100;
    10.     int temp;
    11.     for (i = 0;i < n*n-1;++i)
    12.         for (j = i+1;j < n*n;++j)
    13.             if (b[i] > b[j]){
    14.                 temp = b[i];
    15.                 b[i] = b[j];
    16.                 b[j] = temp;
    17.             }
    18.     cout <<"Ma tran duoc tao ngau nhien va sap xep:";
    19.     for (i = 0;i < n*n;++i){
    20.         if ((i%n)==0) cout <<endl;
    21.         cout <<setw(4) <<b[i];
    22.     }
    23.     //Chuyen thanh ma tran xoan oc
    24.     int tl = -1,rb = n,mark = 0,e;
    25.     for (i = 0;i < n/2;++i){
    26.         tl++; rb--;
    27.         for (e = tl;e < rb;) a[tl][e++] = b[mark++];
    28.         for (e = tl;e < rb;) a[e++][rb] = b[mark++];
    29.         for (e = rb;e > tl;) a[rb][e--] = b[mark++];
    30.         for (e = rb;e > tl;) a[e--][tl] = b[mark++];
    31.     }
    32.     cout <<"\nMa tran xoan oc:\n";
    33.     for (i = 0;i < n;++i){
    34.         for (j = 0;j < n;++j) cout <<setw(4) <<a[i][j];
    35.         cout <<endl;
    36.     }
    37.     getchar(); return 0;
    38. }
    Ý tưởng: vẽ 4 cái tam giác và ghép lại để hình thành ma trận xoắn ốc, cách giải quyết đơn giản nhất, chú trọng số dòng.

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cái này code giải trí tí ^^ ! Đọc cho nhức đầu chơi ~~
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3. int width, height;
    4. int a[20][20];
    5. void initialization()
    6. {
    7.     cout << "Ban hay nhap vao chieu dai va chieu rong :" << endl;
    8.     cout << "Chieu dai: ";
    9.     cin >> width;
    10.     cout << "Chieu rong: ";
    11.     cin >> height;
    12.  
    13.     width += 2;
    14.     height += 2;
    15.  
    16.     for (int i = 0; i < width; i++)
    17.                 for (int j = 0; j < height; j++)
    18.                         if (i * (i - width + 1) * j * (j - height + 1) == 0)
    19.                 a[i][j] = -1;
    20.             else
    21.                 a[i][j] = 0;
    22.        
    23.         for (i = 0; i < width; i++)
    24.         {        
    25.                 for (int j = 0; j < height; j++)
    26.                 {        cout << setw(5) << a[i][j];}
    27.                 cout << endl;
    28.     }
    29.    
    30.     cout << "\n\n\n Ket qua : \n";
    31. }
    32.  
    33. int main()
    34. {
    35.     initialization();
    36.     cin.get();
    37.     int row_step = 0, col_step = 1, row = 1, col = 1, mark = 1;
    38.         do
    39.     {
    40.         do
    41.         {
    42.             a[row][col] = mark++;
    43.             row += row_step;
    44.             col += col_step;
    45.         }
    46.         while ( row >= 1 && row < width - 1 &&  col >= 1
    47.             && col < height - 1 &&  a[row + row_step][col + col_step] == 0 );
    48.  
    49.         if ( row_step == 0 )
    50.         {
    51.             row_step = col_step - row_step;
    52.             col_step = 0;
    53.         }
    54.         else
    55.         {
    56.             col_step = col_step - row_step;
    57.             row_step = 0;
    58.         }
    59.  
    60.     }
    61.     while (a[row][col] == 0);
    62.  
    63.  
    64.     for ( int i = 1; i < width - 1 ; i++)
    65.         {        for ( int j = 1; j < height - 1; j++)
    66.                       {  cout << setw(5) << a[i][j]; }
    67.                 cout << "\n\n";
    68.         }
    69. getch();
    70. }

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Tại sao không cần check điều kiện value ? Đơn giản là vì, cậu scan từng ô rồi gán lần lượt giá trị, tức là giá trị value đi kèm theo mỗi lần quét. Nếu cậu quét đúng vị trí thì value tất nhiên sẽ đúng.
    mong Pete 87 viết cho mình vài dòng code để tham khảo, thanks !

Các đề tài tương tự

  1. Ma trận xoắn ốc | Ma trận xoắn chôn ốc
    Gửi bởi AlexF trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 21
    Bài viết cuối: 04-05-2013, 12:41 AM
  2. Bài tập C Điền các số của 1 ma trận bất kì theo hình xoắn ốc với lập trình C
    Gửi bởi dzuncoi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 05-08-2011, 11:58 PM
  3. Bài tập C++ Tạo ma trận hình xoắn ốc 8x8
    Gửi bởi xoycontinue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 09-05-2011, 09:51 PM
  4. Bài tập C | Ma trận xoắn ốc trong C?
    Gửi bởi nht2007 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 11-05-2009, 05:18 PM
  5. Ma Trận xoắn ốc | Sắp xếp ma trận xoắn ốc!!!!!!
    Gửi bởi xongvaoday trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 03-05-2009, 01:08 PM

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