Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define sfi(arg) scanf("%d", &arg)
- #define sfl(arg) scanf("%lld", &arg)
- #define pf printf
- using namespace std;
- ll key = 0;
- vector<vector<int>> field(9);
- map<pair<ll, pair<int, int>>, int> mp;
- int best = 0;
- string abc;
- int fu( int cur, int x, int y ) {
- if( mp.count(make_pair(key, make_pair(x, y))) == 1 ) {
- best += mp[make_pair(key, make_pair(x, y))];
- return mp[make_pair(key, make_pair(x, y))];
- }
- if( cur == 48 && x == 7 && y == 1 ) {
- best++;
- return 1;
- }
- if( x == 7 && y == 1 )
- return 0;
- int total = 0;
- if( abc[cur] == '?') {
- if( field[x][y + 1] == 0 ) {
- field[x][y + 1] = 1;
- key ^= 1LL << ((x - 1) * 7 + y);
- total += fu( cur + 1, x, y + 1);
- field[x][y + 1] = 0;
- key ^= 1LL << ((x - 1) * 7 + y);
- }
- if( field[x][y - 1] == 0 ) {
- field[x][y - 1] = 1;
- key ^= 1LL << ((x - 1) * 7 + y - 2);
- total += fu( cur + 1, x, y - 1);
- field[x][y - 1] = 0;
- key ^= 1LL << ((x - 1) * 7 + y - 2);
- }
- if( field[x - 1][y] == 0 ) {
- field[x - 1][y] = 1;
- key ^= 1LL << ((x - 2) * 7 + y - 1);
- total += fu( cur + 1, x - 1, y);
- field[x - 1][y] = 0;
- key ^= 1LL << ((x - 2) * 7 + y - 1);
- }
- if( field[x + 1][y] == 0 ) {
- field[x + 1][y] = 1;
- key ^= 1LL << (x * 7 + y - 1);
- total += fu( cur + 1, x + 1, y);
- field[x + 1][y] = 0;
- key ^= 1LL << (x * 7 + y - 1);
- }
- } else if(abc[cur] == 'R') {
- if( field[x][y + 1] == 0 ) {
- field[x][y + 1] = 1;
- key ^= 1LL << ((x - 1) * 7 + y);
- total += fu( cur + 1, x, y + 1);
- field[x][y + 1] = 0;
- key ^= 1LL << ((x - 1) * 7 + y);
- }
- } else if(abc[cur] == 'L') {
- if( field[x][y - 1] == 0 ) {
- field[x][y - 1] = 1;
- key ^= 1LL << ((x - 1) * 7 + y - 2);
- total += fu( cur + 1, x, y - 1);
- field[x][y - 1] = 0;
- key ^= 1LL << ((x - 1) * 7 + y - 2);
- }
- } else if(abc[cur] == 'U') {
- if( field[x - 1][y] == 0 ) {
- field[x - 1][y] = 1;
- key ^= 1LL << ((x - 2) * 7 + y - 1);
- total += fu( cur + 1, x - 1, y);
- field[x - 1][y] = 0;
- key ^= 1LL << ((x - 2) * 7 + y - 1);
- }
- } else {
- if( field[x + 1][y] == 0 ) {
- field[x + 1][y] = 1;
- key ^= 1LL << (x * 7 + y - 1);
- total += fu( cur + 1, x + 1, y);
- field[x + 1][y] = 0;
- key ^= 1LL << (x * 7 + y - 1);
- }
- }
- mp[make_pair(key, make_pair(x, y))] = total;
- }
- int main() {
- for( int x = 0; x < 9; x++ ) {
- for( int y = 0; y < 9; y++ ) {
- field[x].push_back(0);
- }
- }
- for( int x = 0; x < 9; x++ ) {
- field[0][x] = 1;
- field[8][x] = 1;
- field[x][0] = 1;
- field[x][8] = 1;
- }
- field[1][1] = 1;
- cin >> abc;
- fu( 0, 1, 1 );
- pf("%d\n", best);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement