detective1711

MangXoanOc

Jul 18th, 2014
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #define MAX 100
  4. using namespace std;
  5.  
  6. int arrMain[MAX][MAX];
  7. int m, n;
  8.  
  9. //Hàm này tạo 1 số random trong khoảng từ a đến b, dùng để khởi tạo giá trị cho mảng để test, khỏi mất công nhập :D
  10. int cRand(int a, int b){
  11.     return rand() % (b - a + 1) + a;
  12. }
  13.  
  14. //Hàm này để khởi tạo mảng kích thước mxn rồi gán giá trị random
  15. void createArr(){
  16.     for (int i = 0; i < m; i++){
  17.         for (int j = 0; j < n; j++){
  18.             arrMain[i][j] = cRand(1, 99);
  19.         }
  20.     }
  21. }
  22. //Hiển thị mảng theo kiểu thông thường
  23. void Show(){
  24.     for (int i = 0; i < m; i++){
  25.         for (int j = 0; j < n; j++){
  26.             if (arrMain[i][j] >= 10)
  27.                 cout << arrMain[i][j] << "  ";
  28.             else
  29.                 cout << " " << arrMain[i][j] << "  ";
  30.         }
  31.         cout << endl;
  32.     }
  33. }
  34. //Đọc mảng xoắn ốc theo chiều kim đồng hồ, in ra màn hình theo thứ tự xoắn ốc
  35. void ShowXoanOc(){
  36.     //t: top-biến kiểm soát giới hạn trên
  37.     //b: bottom-biến kiểm soát giới hạn dưới
  38.     //l: left-biến kiểm soát giới hạn trái
  39.     //r: right-biến kiểm soát giới hạn phải
  40.     int t=0, b = m, l=0, r = n;
  41.     //cnt: count-biến đếm số lượng phần tử đã duyệt được
  42.     //num: number-biến lưu số lượng phần tử của mảng
  43.     int cnt=0, num = m*n;
  44.  
  45.     //Tiến hành duyệt từng phần tử theo thứ tự vòng xoắn
  46.     while (cnt < num){
  47.         //Vòng for này duyệt theo chiều từ trái qua phải
  48.         for (int i = l; i < r; i++){
  49.             cout << arrMain[t][i] << "  ";
  50.             cnt++;
  51.         }
  52.         t++;//tăng giá trị top lên 1 đơn vị, tức là đã duyệt xong dòng t
  53.  
  54.  
  55.         //Vòng for này duyệt từ trên xuống dưới
  56.         for (int i = t; i < b; i++){
  57.             cout << arrMain[i][r-1] << "  ";
  58.             cnt++;
  59.         }
  60.         r--;//Sau khi duyệt xong cột ở bên phải thì giảm giá trị đi 1 để cột bên phải tiếp theo là cột ở bên trong
  61.  
  62.  
  63.         //Vòng for này duyệt từ phải qua trái ở phía dưới của mảng
  64.         for (int i = r-1; i>=l; i--){
  65.             cout << arrMain[b - 1][i] << "  ";
  66.             cnt++;
  67.         }
  68.         b--;//Giảm giá trị biến bottom, dịch chuyển dòng cần duyệt lên trên
  69.  
  70.  
  71.         //Vòng for này duyệt từ dưới lên trên ở bên trái của mảng
  72.         for (int i = b-1; i >= t; i--){
  73.             cout << arrMain[i][l] << "  ";
  74.             cnt++;
  75.         }
  76.         l++;//Tăng giá trị left, cột bên trái tiếp theo là cột ở bên trong
  77.     }
  78. }
  79. int _tmain(int argc, _TCHAR* argv[])
  80. {
  81.     cout << "Nhap kich thuoc: (Hang/Cot) "; cin >> m >> n;
  82.     createArr();
  83.     Show();
  84.     cout << endl << endl;
  85.     ShowXoanOc();
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment