Advertisement
thienlang

Mã Đi Tuần

Apr 29th, 2013
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <conio.h>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7.  
  8. int h[8][2] = {-2, 1, -1, 2, 1, 2, 2, 1, 2, -1, 1, -2, -1, -2, -2, -1};
  9. int daqua[50][50];
  10. int x, y, m, n, sc;
  11. fstream file;
  12.  
  13.  
  14. //Hàm kiểm tra tọa độ và giới hạn bàn cờ
  15. int ok(int u, int k)
  16. {
  17.     if (u >= 1 && u <= k)
  18.         return 1;
  19.     else
  20.         return 0;
  21. }
  22.  
  23. //hàm nhập kích thước bàn cờ
  24. //nhập tọa độ quân Mã dầu tiên.
  25. //Kiểm tra tọa độ hợp lý
  26. void InPut()
  27. {
  28.     cout << "Nhap so hang (chieu dai M) cua ban co : ";
  29.     cin >> m;
  30.     cout << "Nhap so cot (chieu rong N) cua ban co : ";
  31.     cin >> n;
  32.  
  33.     file << m << " x " << n << endl;
  34.     do
  35.     {
  36.         cout << "Nhap toa do hang ban dau X cua con ma (1<=X<=M) : ";
  37.         cin >> x;
  38.     }
  39.     while (!ok(x, m));//kiểm tra điều kiện hoành độ
  40.  
  41.     do
  42.     {
  43.         cout << "Nhap toa do cot ban dau Y cua con ma (1<=Y<=N) : ";
  44.         cin >> y;
  45.     }
  46.     while (!ok(y, n));//kiểm tra điều kiện tung độ
  47.     file << "(" << x << " , " << y << ")" << endl;
  48. }
  49.  
  50.  //khởi tạo tổng số cách đi ban đầu là 0
  51. // khởi tạo tại vị trí tọa độ xuất phát là nước 1.
  52. void khoitao()
  53. {
  54.     sc = 0;
  55.     daqua[x][y] = 1;
  56. }
  57.  
  58. //hàm xuất bàn cờ, với c là số cách đi tức thời
  59. void OutPut(int c)
  60. {
  61.    
  62.     file << "-----------------------------------------------" << endl;
  63.     file << "Cach thu " << c << " de con ma di het ban co : " << endl;
  64.  
  65.     //In bàn cờ và các nước đi của Mã
  66.     for (int i = 1; i <= m; i++)
  67.     {
  68.         for (int j = 1; j <= n; j++)
  69.         file << setw(4) << daqua[i][j];
  70.         file << endl;
  71.     }
  72. }
  73.  
  74. //Hàm mã xuất tuần..
  75. //hàm đệ quy.
  76. //với u và v là tọa độ ban đầu của Quân mã.
  77. void TimHanhTrinh(int u, int v, int c)
  78. {
  79.    
  80.     int uu, vv; //tọa độ tức thời của Mã trên bàn cờ
  81.  
  82.     // điều kiện dừng với số nước đi của Mã bằng số ô trên bàn cờ..
  83.     if (c == m * n)
  84.     {
  85.         sc++;
  86.         OutPut(sc); //nếu thành thì xuất số cách và bàn cờ.
  87.     }
  88.     else
  89.     {
  90.         //Các nước đi của quân Mã.
  91.         for (int i = 0; i <= 7; i++)
  92.         {
  93.             uu = u + h[i][0]; //tạo tọa độ cho mã từ tọa độ ban đầu u, v
  94.             vv = v + h[i][1];
  95.             if (ok(uu, m) && ok(vv, n))//kiểm tra tọa độ xác định không ra khỏi bàn cờ
  96.                 if (!daqua[uu][vv]) //nếu tại tọa độ đó mà Mã xác định. (#1)
  97.                 {
  98.                     daqua[uu][vv] = c + 1;// tăng số nước đi cho Mã
  99.                     TimHanhTrinh(uu, vv, c + 1); //gọi lại chính hàm đệ quy để kiểm tra
  100.                     daqua[uu][vv] = 0; // đặt lại vị trí tọa độ là 0 để kiểm tra tiếp theo
  101.                 }
  102.         }
  103.     }
  104. }
  105.  
  106.  
  107. void main()
  108. {
  109.     file.open("Ma Di Tuan.txt", ios::out);
  110.     InPut();
  111.     khoitao();
  112.     TimHanhTrinh(x, y, 1);//gọi hàm đệ quy.
  113.     file << "-----------------------------------------------------------------\n-";
  114.     file << "Vay, co' tong cong " << sc << " cach de con ma di het ban co!(^_^)";
  115.     getch();
  116.     file.close();
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement