Link to this code:
https://cses.fi/paste/01070d39c0524cc8c290c4//* 777 */
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
// using vi = vector <int>;
// using vii = vector <vi>;
// using viii = vector <vii>;
// using pii = pair<int,int>;
// using vpii = vector<pii>;
// vpii dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int dirx[4] = {-1, 0, 1, 0};
int diry[4] = {0, 1, 0, -1};
const int rows = 9, cols = 9, maxSteps = 48;
int arr[maxSteps];
int vis[rows][cols];
void pre(){
}
int rec(int steps, int row,int col) {
// pruning
if (vis[row - 1][col] && vis[row + 1][col] && !vis[row][col - 1] && !vis[row][col + 1]) return 0;
if (!vis[row - 1][col] && !vis[row + 1][col] && vis[row][col - 1] && vis[row][col + 1]) return 0;
// base case
if ((row == (rows - 2)) && (col == 1)) {
return steps == maxSteps;
}
if (steps == maxSteps) {
return 0;
}
vis[row][col] = 1;
int cnt = 0;
if (arr[steps] < 4) { // forced
int dx = dirx[arr[steps]], dy = diry[arr[steps]];
if (!vis[row + dx][col + dy]) cnt += rec(steps + 1, row + dx, col + dy);
} else {
for (int i = 0 ; i < 4 ; ++i) {
int dx = dirx[i], dy = diry[i];
if (!vis[row + dx][col + dy]) cnt += rec(steps + 1, row + dx, col + dy);
}
}
vis[row][col] = 0;
return cnt;
}
void print2d() {
for (int row = 0 ; row < rows ; ++row) {
for (int col = 0 ; col < cols ; ++col) {
cout << vis[row][col] << " ";
}
cout << endl;
}
}
void charToInt(string s) {
for (int i = 0 ; i < maxSteps ; ++i) {
switch (s[i]) {
case 'U':
arr[i] = 0;
break;
case 'R':
arr[i] = 1;
break;
case 'D':
arr[i] = 2;
break;
case 'L':
arr[i] = 3;
break;
default:
arr[i] = 4;
}
}
}
void solve(){
string s;cin>>s;
for (int row = 0 ; row < rows ; ++row) vis[row][0] = vis[row][cols - 1] = 1;
for (int col = 0 ; col < cols ; ++col) vis[0][col] = vis[rows - 1][col] = 1;
// print2d();
charToInt(s);
// for (auto &x : arr) cout << x << " ";
int res = rec(0, 1, 1);
cout << res << endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// pre();
solve();
}