
样例:
- 01010101001011001001010110010110100100001000101010
- 00001000100000101010010000100000001001100110100101
- 01111011010010001000001101001011100011000000010000
- 01000000001010100011010000101000001010101011001011
- 00011111000000101000010010100010100000101100000000
- 11001000110101000010101100011010011010101011110111
- 00011011010101001001001010000001000101001110000000
- 10100000101000100110101010111110011000010000111010
- 00111000001010100001100010000001000101001100001001
- 11000110100001110010001001010101010101010001101000
- 00010000100100000101001010101110100010101010000101
- 11100100101001001000010000010101010100100100010100
- 00000010000000101011001111010001100000101010100011
- 10101010011100001000011000010110011110110100001000
- 10101010100001101010100101000010100000111011101001
- 10000000101100010000101100101101001011100000000100
- 10101001000000010100100001000100000100011110101001
- 00101001010101101001010100011010101101110000110101
- 11001010000100001100000010100101000001000111000010
- 00001000110000110101101000000100101001001000011101
- 10100101000101000000001110110010110101101010100001
- 00101000010000110101010000100010001001000100010101
- 10100001000110010001000010101001010101011111010010
- 00000100101000000110010100101001000001000000000010
- 11010000001001110111001001000011101001011011101000
- 00000110100010001000100000001000011101000000110011
- 10101000101000100010001111100010101001010000001000
- 10000010100101001010110000000100101010001011101000
- 00111100001000010000000110111000000001000000001011
- 10000001100111010111010001000110111010101101111000
使用常见的bfs算法算出最短路,重点在于如何输出路径,我们可以每走一步将上一步使用pre数组存下即可,我们从{1,1}出发到{30,50}结束,可以从结束的位置不断找到pre也就是此位置的上一个位置,如果找到了{1,1}也就是说我们找到了所有的位置,但我们此时是倒着找的需要将其翻转即可,注意需要按照字典序也就是DLRU的顺序寻找
- #include
- using namespace std;
- const int N = 2e3 + 10;
- typedef pair<int, int> PII;
- PII pre[N][N], endd, startt;
- queue
q; - string s;
- bool st[N][N];
- char g[N][N];
- int dx[4] = {1, 0, 0, -1};
- int dy[4] = {0, -1, 1, 0};
- void bfs()
- {
- st[1][1] = true;
- while(q.size())
- {
- auto t = q.front();
- int x = t.first;
- int y = t.second;
- q.pop();
- for(int i = 0; i < 4; i ++)
- {
- int a = x + dx[i];
- int b = y + dy[i];
- if(a < 1 || a > 30 || b < 1 || b > 50 || st[a][b] == 1)continue;
- if(g[a][b] == '0')
- {
- q.push({a, b});
- pre[a][b] = t;
- st[a][b] = true;
- }
- }
- }
- }
- int main()
- {
- for(int i = 1; i <= 30; i ++)
- {
- for(int j = 1; j <= 50; j ++)
- {
- cin >> g[i][j];
- }
- }
- q.push({1, 1});
- bfs();
- endd = {30, 50};
- while(true)
- {
- char t;
- startt = endd;
- endd = pre[endd.first][endd.second];
- // cout << endd.first << ' ' << endd.second << '\n';
- if(endd.first - startt.first == -1 && endd.second - startt.second == 0)s += "D";
- else if(endd.first - startt.first == 1 && endd.second - startt.second == 0)s += "U";
- else if(endd.first - startt.first == 0 && endd.second - startt.second == -1)s += "R";
- else if(endd.first - startt.first == 0 && endd.second - startt.second == 1)s += "L";
- if(endd.first == 1 && endd.second == 1)break;
- }
- reverse(s.begin(), s.end());
- cout << s;
- return 0;
- }