fork download
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define fi first
  4. #define se second
  5.  
  6. using namespace std;
  7.  
  8. typedef pair<int, int> ii;
  9. const int N = 15+5;
  10.  
  11. string s;
  12. char ans[N];
  13. int n,m,k;
  14. int a[N][8];
  15.  
  16. int calc(int i, int j, int dist) // tính khoảng cách mới nếu đang ở vòng i, lấy 2 thẻ a[i][j] và a[i][j+1] và đã đi được dist
  17. {
  18. return (dist * (a[i][j] + 1) + a[i][j+1]) % m;
  19. }
  20.  
  21. bool dfs(int i, int dist)
  22. {
  23. if (i == n) return min(dist, m - dist) <= k; // kiểm tra xem có thỏa mãn hay không
  24. if (s[i] == 'T')
  25. {
  26. // đệ quy trường hợp FJ chọn dưới
  27. if (dfs(i+1, calc(i, 6, dist)) && dfs(i+1, calc(i, 4, dist))) // trường hợp này mình dfs trường hợp Bessie chọn trên sau bởi vì thực tế Bessie chọn trên nên sau khi FJ chọn rồi thì FJ cũng sẽ biết là Bessie chọn trên
  28. {
  29. ans[i] = 'B';
  30. return 1;
  31. }
  32. // đệ quy trường hợp FJ chọn trên
  33. ans[i] = 'T';
  34. return dfs(i+1, calc(i, 2, dist)) && dfs(i+1, calc(i, 0, dist)); // cách dfs này tương tự như trên
  35. } else
  36. {
  37. // đệ quy trường hợp FJ chọn dưới
  38. if (dfs(i+1, calc(i, 4, dist)) && dfs(i+1, calc(i, 6, dist))) // cách dfs này tương tự như trên
  39. {
  40. ans[i] = 'B';
  41. return 1;
  42. }
  43. // đệ quy trường hợp FJ chọn trên
  44. ans[i] = 'T';
  45. return dfs(i+1, calc(i, 0, dist)) && dfs(i+1, calc(i, 2, dist)); // cách dfs này tương tự như trên
  46. }
  47. }
  48.  
  49. void solve()
  50. {
  51. cin>>n>>m>>k>>s;
  52. for (int i = 0; i < n; i++) for (int j = 0; j < 8; j++) cin>>a[i][j];
  53. dfs(0,0);
  54. for (int i = 0; i < n; i++) cout<<ans[i];
  55. }
  56.  
  57. signed main()
  58. {
  59. solve();
  60. }
Success #stdin #stdout 0s 5272KB
stdin
Standard input is empty
stdout
Standard output is empty