fork download
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. int n, m, countSolution = 0;
  5. bool PrintSolution = false; // Tùy chọn có in phương án hay không
  6. bool check(vector < int > a, int x, int y) {
  7. // kiểm tra tất cả các quân đã đặt trong a có ăn quân đặt ở ô x, y
  8. for (int i = 0; i < a.size(); i++) {
  9. if ((a[i] != -1) && ((y == a[i]) || (i == x) || (i + a[i] == x + y) || (i - a[i] == x - y)))
  10. return false;
  11. }
  12. return true;
  13. }
  14. void viewArr(vector <int> a) {
  15. for (int i = 0; i < a.size(); i++)
  16. cout << a[i] << " ";
  17. cout << endl;
  18. }
  19. void sol(int k, vector < int > a) {
  20. // điểm dừng
  21. if (a.back() != -1) { // khi đã đặt đủ quân hậu --> mảng a được đánh dấu hết
  22. if (PrintSolution) { // Tùy chọn có in phương án hay không
  23. cout << "Found " << endl;
  24. for (int i = 0; i < n; i++) cout << i << " " << a[i] << endl;
  25. cout << "----------" << endl;
  26. }
  27. countSolution++; // Đếm số lượng phương án đã xác định được
  28. return;
  29. };
  30. // Gọi đệ quy
  31. for (int i = 0; i < m; i++) {
  32. if (check(a, k, i)) { // kiểm tra xem đặt được vào cột i hay không
  33. a[k] = i; // đặt thử lên cột i trên hàng k
  34. sol(k + 1, a);
  35. a[k] = -1; // hủy cách đặt tại cột i
  36. }
  37. }
  38. return;
  39. }
  40. int main() {
  41. ios_base::sync_with_stdio(false);
  42. cin.tie(NULL);
  43. cout.tie(NULL);
  44. cin>>n>>m;
  45. vector < int > a(n, -1); // Khởi tạo phương án trống
  46. sol(0, a);
  47. cout << countSolution;
  48. return 0;
  49. }
Success #stdin #stdout 0.01s 5276KB
stdin
8 8
stdout
92