#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <ctime>
#include <climits>
#include <cstring>
using namespace std;
const int N = 21;
char maze[N][N];
bool visited[N][N];
int dx[] = {0, 0, -2, 2};
int dy[] = {-2, 2, 0, 0};
void generateMaze(int x, int y) {
visited[x][y] = true;
maze[x][y] = ' ';
vector<int> dirs = {0, 1, 2, 3};
random_shuffle(dirs.begin(), dirs.end());
for (int i : dirs) {
int nx = x + dx[i], ny = y + dy[i];
if (nx > 0 && ny > 0 && nx < N - 1 && ny < N - 1 && !visited[nx][ny]) {
maze[x + dx[i] / 2][y + dy[i] / 2] = ' ';
generateMaze(nx, ny);
}
}
}
struct Node {
int x, y, dist;
bool operator>(const Node& other) const {
return dist > other.dist;
}
};
int dijkstra(pair<int, int> start, pair<int, int> end, vector<vector<int>>& dist) {
priority_queue<Node, vector<Node>, greater<Node>> pq;
pq.push({start.first, start.second, 0});
dist[start.first][start.second] = 0;
while (!pq.empty()) {
Node cur = pq.top(); pq.pop();
if (cur.x == end.first && cur.y == end.second)
return cur.dist;
for (int i = 0; i < 4; i++) {
int nx = cur.x + dx[i] / 2, ny = cur.y + dy[i] / 2;
if (nx >= 0 && ny >= 0 && nx < N && ny < N && maze[nx][ny] == ' ') {
int new_dist = cur.dist + 1;
if (new_dist < dist[nx][ny]) {
dist[nx][ny] = new_dist;
pq.push({nx, ny, new_dist});
}
}
}
}
return -1;
}
void printMaze(const vector<vector<int>>& dist, pair<int, int> end) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if (i == end.first && j == end.second)
cout << 'E';
else if (dist[i][j] != INT_MAX)
cout << '.';
else
cout << maze[i][j];
}
cout << endl;
}
}
int main() {
srand(time(0));
memset(maze, '#', sizeof maze);
memset(visited, 0, sizeof visited);
generateMaze(1, 1);
pair<int, int> start = {1, 1};
pair<int, int> end = {N - 2, N - 2};
vector<vector<int>> dist(N, vector<int>(N, INT_MAX));
int pathLength = dijkstra(start, end, dist);
cout << "Generated Maze with shortest path marked:\n";
printMaze(dist, end);
cout << "\nShortest path length: " << pathLength << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjdGltZT4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxjc3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSAyMTsKY2hhciBtYXplW05dW05dOwpib29sIHZpc2l0ZWRbTl1bTl07CmludCBkeFtdID0gezAsIDAsIC0yLCAyfTsKaW50IGR5W10gPSB7LTIsIDIsIDAsIDB9OwoKdm9pZCBnZW5lcmF0ZU1hemUoaW50IHgsIGludCB5KSB7CiAgICB2aXNpdGVkW3hdW3ldID0gdHJ1ZTsKICAgIG1hemVbeF1beV0gPSAnICc7CiAgICB2ZWN0b3I8aW50PiBkaXJzID0gezAsIDEsIDIsIDN9OwogICAgcmFuZG9tX3NodWZmbGUoZGlycy5iZWdpbigpLCBkaXJzLmVuZCgpKTsKCiAgICBmb3IgKGludCBpIDogZGlycykgewogICAgICAgIGludCBueCA9IHggKyBkeFtpXSwgbnkgPSB5ICsgZHlbaV07CiAgICAgICAgaWYgKG54ID4gMCAmJiBueSA+IDAgJiYgbnggPCBOIC0gMSAmJiBueSA8IE4gLSAxICYmICF2aXNpdGVkW254XVtueV0pIHsKICAgICAgICAgICAgbWF6ZVt4ICsgZHhbaV0gLyAyXVt5ICsgZHlbaV0gLyAyXSA9ICcgJzsKICAgICAgICAgICAgZ2VuZXJhdGVNYXplKG54LCBueSk7CiAgICAgICAgfQogICAgfQp9CgpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQgeCwgeSwgZGlzdDsKICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE5vZGUmIG90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIGRpc3QgPiBvdGhlci5kaXN0OwogICAgfQp9OwoKaW50IGRpamtzdHJhKHBhaXI8aW50LCBpbnQ+IHN0YXJ0LCBwYWlyPGludCwgaW50PiBlbmQsIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIGRpc3QpIHsKICAgIHByaW9yaXR5X3F1ZXVlPE5vZGUsIHZlY3RvcjxOb2RlPiwgZ3JlYXRlcjxOb2RlPj4gcHE7CiAgICBwcS5wdXNoKHtzdGFydC5maXJzdCwgc3RhcnQuc2Vjb25kLCAwfSk7CiAgICBkaXN0W3N0YXJ0LmZpcnN0XVtzdGFydC5zZWNvbmRdID0gMDsKCiAgICB3aGlsZSAoIXBxLmVtcHR5KCkpIHsKICAgICAgICBOb2RlIGN1ciA9IHBxLnRvcCgpOyBwcS5wb3AoKTsKICAgICAgICBpZiAoY3VyLnggPT0gZW5kLmZpcnN0ICYmIGN1ci55ID09IGVuZC5zZWNvbmQpCiAgICAgICAgICAgIHJldHVybiBjdXIuZGlzdDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgaW50IG54ID0gY3VyLnggKyBkeFtpXSAvIDIsIG55ID0gY3VyLnkgKyBkeVtpXSAvIDI7CiAgICAgICAgICAgIGlmIChueCA+PSAwICYmIG55ID49IDAgJiYgbnggPCBOICYmIG55IDwgTiAmJiBtYXplW254XVtueV0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICBpbnQgbmV3X2Rpc3QgPSBjdXIuZGlzdCArIDE7CiAgICAgICAgICAgICAgICBpZiAobmV3X2Rpc3QgPCBkaXN0W254XVtueV0pIHsKICAgICAgICAgICAgICAgICAgICBkaXN0W254XVtueV0gPSBuZXdfZGlzdDsKICAgICAgICAgICAgICAgICAgICBwcS5wdXNoKHtueCwgbnksIG5ld19kaXN0fSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCnZvaWQgcHJpbnRNYXplKGNvbnN0IHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIGRpc3QsIHBhaXI8aW50LCBpbnQ+IGVuZCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47ICsraikgewogICAgICAgICAgICBpZiAoaSA9PSBlbmQuZmlyc3QgJiYgaiA9PSBlbmQuc2Vjb25kKQogICAgICAgICAgICAgICAgY291dCA8PCAnRSc7CiAgICAgICAgICAgIGVsc2UgaWYgKGRpc3RbaV1bal0gIT0gSU5UX01BWCkKICAgICAgICAgICAgICAgIGNvdXQgPDwgJy4nOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjb3V0IDw8IG1hemVbaV1bal07CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgZW5kbDsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBzcmFuZCh0aW1lKDApKTsKICAgIG1lbXNldChtYXplLCAnIycsIHNpemVvZiBtYXplKTsKICAgIG1lbXNldCh2aXNpdGVkLCAwLCBzaXplb2YgdmlzaXRlZCk7CgogICAgZ2VuZXJhdGVNYXplKDEsIDEpOwoKICAgIHBhaXI8aW50LCBpbnQ+IHN0YXJ0ID0gezEsIDF9OwogICAgcGFpcjxpbnQsIGludD4gZW5kID0ge04gLSAyLCBOIC0gMn07CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBkaXN0KE4sIHZlY3RvcjxpbnQ+KE4sIElOVF9NQVgpKTsKICAgIGludCBwYXRoTGVuZ3RoID0gZGlqa3N0cmEoc3RhcnQsIGVuZCwgZGlzdCk7CgogICAgY291dCA8PCAiR2VuZXJhdGVkIE1hemUgd2l0aCBzaG9ydGVzdCBwYXRoIG1hcmtlZDpcbiI7CiAgICBwcmludE1hemUoZGlzdCwgZW5kKTsKICAgIGNvdXQgPDwgIlxuU2hvcnRlc3QgcGF0aCBsZW5ndGg6ICIgPDwgcGF0aExlbmd0aCA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9