fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <set>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. // Hàm kiểm tra xem dãy đã được sắp xếp tăng dần hay chưa
  10. bool isSorted(const vector<int>& arr) {
  11. for (size_t i = 1; i < arr.size(); ++i) {
  12. if (arr[i - 1] > arr[i]) {
  13. return false;
  14. }
  15. }
  16. return true;
  17. }
  18.  
  19. // Hàm thực hiện BFS để tìm số bước ít nhất
  20. int minFlipsToSort(vector<int> arr) {
  21. int n = arr.size();
  22. vector<int> target(n);
  23. for (int i = 0; i < n; ++i) {
  24. target[i] = i + 1;
  25. }
  26.  
  27. // Nếu dãy đã sắp xếp, không cần thao tác nào
  28. if (arr == target) {
  29. return 0;
  30. }
  31.  
  32. // Hàng đợi lưu trữ các trạng thái và số bước
  33. queue<pair<vector<int>, int>> q;
  34. q.push({arr, 0});
  35.  
  36. // Tập hợp lưu các trạng thái đã thăm
  37. set<vector<int>> visited;
  38. visited.insert(arr);
  39.  
  40. while (!q.empty()) {
  41. auto [current, steps] = q.front();
  42. q.pop();
  43.  
  44. // Thử tất cả các phép đảo ngược đoạn đầu có thể
  45. for (int i = 1; i < n; ++i) {
  46. vector<int> next = current;
  47. reverse(next.begin(), next.begin() + i + 1);
  48.  
  49. // Nếu đạt được dãy mục tiêu, trả về số bước
  50. if (next == target) {
  51. return steps + 1;
  52. }
  53.  
  54. // Nếu trạng thái mới chưa được thăm, thêm vào hàng đợi
  55. if (visited.find(next) == visited.end()) {
  56. visited.insert(next);
  57. q.push({next, steps + 1});
  58. }
  59. }
  60. }
  61.  
  62. // Trường hợp không tìm thấy (không xảy ra với n ≤ 8)
  63. return -1;
  64. }
  65.  
  66. int main() {
  67. int n;
  68. cin >> n;
  69. vector<int> arr(n);
  70. for (int& x : arr) {
  71. cin >> x;
  72. }
  73.  
  74. int result = minFlipsToSort(arr);
  75. cout << result << endl;
  76.  
  77. return 0;
  78. }
Success #stdin #stdout 0.01s 5284KB
stdin
5
5 2 3 4 1 
stdout
4