CSES - Aalto Competitive Programming 2024 - wk9 - Mon - Results
Submission details
Task:Chess board tour
Sender:ZDHKLV
Submission time:2024-11-04 17:43:19 +0200
Language:C++ (C++11)
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#30.00 sdetails
#4ACCEPTED0.00 sdetails
#50.01 sdetails
#6ACCEPTED0.00 sdetails
#70.00 sdetails
#8ACCEPTED0.00 sdetails
#9ACCEPTED0.00 sdetails
#10ACCEPTED0.00 sdetails
#11ACCEPTED0.00 sdetails
#12ACCEPTED0.00 sdetails
#13ACCEPTED0.00 sdetails
#14ACCEPTED0.00 sdetails
#15ACCEPTED0.00 sdetails
#160.00 sdetails
#170.00 sdetails
#180.00 sdetails
#19ACCEPTED0.00 sdetails
#20ACCEPTED0.00 sdetails
#210.00 sdetails
#22ACCEPTED0.00 sdetails
#230.00 sdetails
#240.00 sdetails
#25ACCEPTED0.00 sdetails
#260.00 sdetails
#270.00 sdetails
#280.00 sdetails
#290.00 sdetails
#300.00 sdetails
#31ACCEPTED0.01 sdetails
#32ACCEPTED0.00 sdetails
#330.01 sdetails
#340.00 sdetails
#350.00 sdetails
#360.00 sdetails
#37ACCEPTED0.01 sdetails
#380.01 sdetails
#390.00 sdetails
#400.00 sdetails
#410.01 sdetails
#420.00 sdetails
#430.01 sdetails
#44ACCEPTED0.00 sdetails
#450.00 sdetails
#460.00 sdetails
#470.05 sdetails
#480.07 sdetails
#490.01 sdetails
#500.01 sdetails
#510.13 sdetails
#52ACCEPTED0.01 sdetails
#530.13 sdetails
#540.01 sdetails
#550.01 sdetails
#560.00 sdetails

Code

#include <bits/stdc++.h>

using namespace std;

bool solve(int n, int m, vector<char> &output) {

    vector<vector<bool>> visited(n, vector<bool>(m, false));

    typedef struct {
        int x, y, seen;
        pair<int, int> parent;
    } state_t;

    stack<state_t> s;
    s.push({ 0, 0, 0, {-1, -1} });

    vector<vector<pair<int, int>>> parent(n, vector<pair<int, int>>(m));

    while (!s.empty()) {

        state_t pos = s.top();
        s.pop();

        int x = pos.x;
        int y = pos.y;

        if (visited[x][y]) {
            if (x == 0 && y == 0) {
                if (pos.seen < n * m) continue;
                
                int px = pos.parent.first;
                int py = pos.parent.second;

                while (px != 0 || py != 0) {
                    char c;
                    if (px == x-1) c = 'L';
                    else if (px == x+1) c = 'R';
                    else if (py == y-1) c = 'U';
                    else c = 'D';
                    output.push_back(c);
                    px = parent[pos.parent.first][pos.parent.second].first;
                    py = parent[pos.parent.first][pos.parent.second].second;
                }

                return true;

            }
            continue;
        }

        bool block_up = (y == 0 || visited[x][y-1]);
        bool block_left = (x == 0 || visited[x-1][y]);
        bool block_right = (x == n-1 || visited[x+1][y]);
        bool block_down = (y == m-1 || visited[x][y+1]);

        bool can_go_left = (x > 0 && !visited[x-1][y]);
        bool can_go_right = (x+1 < n && !visited[x+1][y]);
        bool can_go_up = (y > 0 && !visited[x][y-1]);
        bool can_go_down = (y+1 < m && !visited[x][y+1]);

        if (block_up && (can_go_left && can_go_right)) continue;
        if (block_down && (can_go_left && can_go_right)) continue;
        if (block_left && (can_go_up && can_go_down)) continue;
        if (block_right && (can_go_up && can_go_down)) continue;

        visited[x][y] = true;
        parent[x][y] = pos.parent;

        if (x > 0 && (!visited[x-1][y] || (x-1 == 0 && y == 0))) {
            //output.push_back('U');
            s.push({ x-1, y, pos.seen+1, {x, y} });
            //bool b = dfs(x-1, y, pos.seen+1, visited, n, m, output);
            //if (b) return true;
            //output.pop_back();
        }

        if (x+1 < n && !visited[x+1][y]) {
            //output.push_back('D');

            s.push({ x+1, y, pos.seen+1, {x, y} });
            //bool b = dfs(x+1, y, pos.seen+1, visited, n, m, output);
            //if (b) return true;
            //output.pop_back();
        }

        if (y > 0 && (!visited[x][y-1] || (x == 0 && y-1 == 0))) {
            //output.push_back('L');
            
            s.push({ x, y-1, pos.seen+1, {x, y} });

            //bool b = dfs(x, y-1, pos.seen+1, visited, n, m, output);
            //if (b) return true;
            //output.pop_back();
        }

        if (y+1 < m && !visited[x][y+1]) {
            //output.push_back('R');
            //bool b = dfs(x, y+1, pos.seen+1, visited, n, m, output);
            //if (b) return true;
            //output.pop_back();
            s.push({ x, y+1, pos.seen+1, {x, y} });

        }

    }

    return false;

}

bool dfs(int x, int y, int seen, vector<vector<bool>> &visited, int n, int m, vector<char> &output) {

    if (visited[x][y]) {
        if (x == 0 && y == 0) {
            if (seen < n * m) return false;
            return true;
        }
        return false;
    }

    bool block_up = (y == 0 || visited[x][y-1]);
    bool block_left = (x == 0 || visited[x-1][y]);
    bool block_right = (x == n-1 || visited[x+1][y]);
    bool block_down = (y == m-1 || visited[x][y+1]);

    bool can_go_left = (x > 0 && !visited[x-1][y]);
    bool can_go_right = (x+1 < n && !visited[x+1][y]);
    bool can_go_up = (y > 0 && !visited[x][y-1]);
    bool can_go_down = (y+1 < m && !visited[x][y+1]);

    if (block_up && (can_go_left && can_go_right)) return false;
    if (block_down && (can_go_left && can_go_right)) return false;
    if (block_left && (can_go_up && can_go_down)) return false;
    if (block_right && (can_go_up && can_go_down)) return false;

    visited[x][y] = true;

    if (x > 0 && (!visited[x-1][y] || (x-1 == 0 && y == 0))) {
        output.push_back('U');
        bool b = dfs(x-1, y, seen+1, visited, n, m, output);
        if (b) return true;
        output.pop_back();
    }

    if (x+1 < n && !visited[x+1][y]) {
        output.push_back('D');
        bool b = dfs(x+1, y, seen+1, visited, n, m, output);
        if (b) return true;
        output.pop_back();
    }

    if (y > 0 && (!visited[x][y-1] || (x == 0 && y-1 == 0))) {
        output.push_back('L');
        bool b = dfs(x, y-1, seen+1, visited, n, m, output);
        if (b) return true;
        output.pop_back();
    }

    if (y+1 < m && !visited[x][y+1]) {
        output.push_back('R');
        bool b = dfs(x, y+1, seen+1, visited, n, m, output);
        if (b) return true;
        output.pop_back();
    }

    return false;

}

int main() {

    int n, m;
    cin >> n >> m;

    vector<vector<bool>> visited(n, vector<bool>(m, false));
    vector<char> output;
    bool b = dfs(0, 0, 0, visited, n, m, output);
    //bool b = solve(n, m, output);

    if (!b) {
        cout << -1 << endl;
    } else {
        for (char c : output)
            cout << c;
        cout << endl;
    }

}

Test details

Test 1

Verdict: ACCEPTED

input
2 2

correct output
DRUL

user output
DRUL

Test 2

Verdict: ACCEPTED

input
2 2

correct output
DRUL

user output
DRUL

Test 3

Verdict:

input
2 3

correct output
RRDLLU

user output
-1

Test 4

Verdict: ACCEPTED

input
2 2

correct output
DRUL

user output
DRUL

Test 5

Verdict:

input
4 4

correct output
DDDRUURDDRUUULLL

user output
-1

Test 6

Verdict: ACCEPTED

input
3 3

correct output
-1

user output
-1

Test 7

Verdict:

input
4 4

correct output
DDDRUURDDRUUULLL

user output
-1

Test 8

Verdict: ACCEPTED

input
3 5

correct output
-1

user output
-1

Test 9

Verdict: ACCEPTED

input
3 2

correct output
DDRUUL

user output
DDRUUL

Test 10

Verdict: ACCEPTED

input
4 2

correct output
DDDRUUUL

user output
DDDRUUUL

Test 11

Verdict: ACCEPTED

input
5 5

correct output
-1

user output
-1

Test 12

Verdict: ACCEPTED

input
2 2

correct output
DRUL

user output
DRUL

Test 13

Verdict: ACCEPTED

input
5 5

correct output
-1

user output
-1

Test 14

Verdict: ACCEPTED

input
2 2

correct output
DRUL

user output
DRUL

Test 15

Verdict: ACCEPTED

input
5 2

correct output
DDDDRUUUUL

user output
DDDDRUUUUL

Test 16

Verdict:

input
2 3

correct output
RRDLLU

user output
-1

Test 17

Verdict:

input
6 7

correct output
RRRRRRDLLLLLDRRRRRDLLLLLDRRRRR...

user output
-1

Test 18

Verdict:

input
5 10

correct output
DDDDRUUURDDDRUUURDDDRUUURDDDRU...

user output
-1

Test 19

Verdict: ACCEPTED

input
5 3

correct output
-1

user output
-1

Test 20

Verdict: ACCEPTED

input
6 2

correct output
DDDDDRUUUUUL

user output
DDDDDRUUUUUL

Test 21

Verdict:

input
10 10

correct output
DDDDDDDDDRUUUUUUUURDDDDDDDDRUU...

user output
-1

Test 22

Verdict: ACCEPTED

input
3 2

correct output
DDRUUL

user output
DDRUUL

Test 23

Verdict:

input
10 10

correct output
DDDDDDDDDRUUUUUUUURDDDDDDDDRUU...

user output
-1

Test 24

Verdict:

input
2 4

correct output
DRRRULLL

user output
-1

Test 25

Verdict: ACCEPTED

input
9 2

correct output
DDDDDDDDRUUUUUUUUL

user output
DDDDDDDDRUUUUUUUUL

Test 26

Verdict:

input
2 5

correct output
RRRRDLLLLU

user output
-1

Test 27

Verdict:

input
56 60

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 28

Verdict:

input
43 100

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 29

Verdict:

input
45 20

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 30

Verdict:

input
56 9

correct output
RRRRRRRRDLLLLLLLDRRRRRRRDLLLLL...

user output
-1

Test 31

Verdict: ACCEPTED

input
97 91

correct output
-1

user output
-1

Test 32

Verdict: ACCEPTED

input
23 7

correct output
-1

user output
-1

Test 33

Verdict:

input
90 95

correct output
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...

user output
-1

Test 34

Verdict:

input
9 24

correct output
DDDDDDDDRUUUUUUURDDDDDDDRUUUUU...

user output
-1

Test 35

Verdict:

input
88 3

correct output
RRDLDRDLDRDLDRDLDRDLDRDLDRDLDR...

user output
-1

Test 36

Verdict:

input
3 38

correct output
DDRURDRURDRURDRURDRURDRURDRURD...

user output
-1

Test 37

Verdict: ACCEPTED

input
111 119

correct output
-1

user output
-1

Test 38

Verdict:

input
84 200

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 39

Verdict:

input
88 38

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 40

Verdict:

input
111 16

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 41

Verdict:

input
194 181

correct output
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...

user output
-1

Test 42

Verdict:

input
46 12

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 43

Verdict:

input
179 190

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 44

Verdict: ACCEPTED

input
17 47

correct output
-1

user output
-1

Test 45

Verdict:

input
175 4

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 46

Verdict:

input
4 74

correct output
DDDRUURDDRUURDDRUURDDRUURDDRUU...

user output
-1

Test 47

Verdict:

input
550 594

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 48

Verdict:

input
418 998

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 49

Verdict:

input
437 186

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 50

Verdict:

input
552 72

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 51

Verdict:

input
968 901

correct output
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...

user output
-1

Test 52

Verdict: ACCEPTED

input
223 57

correct output
-1

user output
-1

Test 53

Verdict:

input
893 948

correct output
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD...

user output
-1

Test 54

Verdict:

input
78 229

correct output
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...

user output
-1

Test 55

Verdict:

input
874 13

correct output
RRRRRRRRRRRRDLLLLLLLLLLLDRRRRR...

user output
-1

Test 56

Verdict:

input
12 366

correct output
DDDDDDDDDDDRUUUUUUUUUURDDDDDDD...

user output
-1