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
{
return(dist *(a[i][j]+1)+ a[i][j+1])% m;
}
bool dfs(int i, int dist)
{
if(i == n)return min(dist, m - dist)<= k;// kiểm tra xem có thỏa mãn hay không
if(s[i]=='T')
{
// đệ quy trường hợp FJ chọn dưới
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
{
ans[i]='B';
return1;
}
// đệ quy trường hợp FJ chọn trên
ans[i]='T';
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
}else
{
// đệ quy trường hợp FJ chọn dưới
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
{
ans[i]='B';
return1;
}
// đệ quy trường hợp FJ chọn trên
ans[i]='T';
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
}
}
void solve()
{
cin>>n>>m>>k>>s;
for(int i =0; i < n; i++)for(int j =0; j <8; j++)cin>>a[i][j];