CSES - Shared codeLink to this code:
https://cses.fi/paste/59a84841ea2cac34639b6f/
#include <bits/stdc++.h>
using ll = long long int;
using ull = unsigned long long int;
using namespace std;
const ll modular = 1e9 + 7;
const double pi = 22 / 7;
const ll INF = LLONG_MAX;
ll col, row;
vector<pair<ll, ll>> mindex;
char graph[1005][1005];
ll disx[] = {1, -1, 0, 0};
ll disy[] = {0, 0, -1, 1};
string way = "DULR";
map<pair<ll, ll>, ll> vis;
map<pair<ll, ll>, pair<ll, ll>> parent;
map<pair<ll, ll>, char> pos;
map<pair<ll, ll>, ll> dism;
map<pair<ll, ll>, ll> dist;
bool isValid(ll x, ll y)
{
if (x < 0 || y < 0 || x >= col || y >= row)
return false;
if (graph[x][y] == '#' || vis[{x, y}] == 1)
return false;
return true;
}
void bfsm()
{
vis.clear();
queue<pair<ll, ll>> q;
for (auto it : mindex)
{
ll x = it.first;
ll y = it.second;
vis[{x, y}] = 1;
q.push({x, y});
dism[{x, y}] = 1;
}
while (!q.empty())
{
pair<ll, ll> p = q.front();
q.pop();
ll currx = p.first;
ll curry = p.second;
for (int i = 0; i < 4; i++)
{
ll newx = currx + disx[i];
ll newy = curry + disy[i];
if (isValid(newx, newy))
{
q.push({newx, newy});
vis[{newx, newy}] = 1;
(dism[{newx, newy}] == 0) ? (dism[{newx, newy}] = dism[{currx, curry}] + 1) : (dism[{newx, newy}] = min(dism[{newx, newy}], dism[{currx, curry}] + 1));
}
}
}
}
void bfs(ll x, ll y)
{
vis.clear();
vis[{x, y}] = 1;
queue<pair<ll, ll>> q;
q.push({x, y});
dist[{x, y}] = 1;
parent[{x, y}] = {-1, -1};
pos[{x, y}] = 1;
while (!q.empty())
{
pair<ll, ll> p = q.front();
q.pop();
ll currx = p.first;
ll curry = p.second;
for (int i = 0; i < 4; i++)
{
ll newx = currx + disx[i];
ll newy = curry + disy[i];
if (isValid(newx, newy))
{
q.push({newx, newy});
vis[{newx, newy}] = 1;
dist[{newx, newy}] = dist[{currx, curry}] + 1;
parent[{newx, newy}] = {currx, curry};
pos[{newx, newy}] = way[i];
}
}
}
}
void solve()
{
vector<pair<ll, ll>> aindex;
cin >> col >> row;
for (ll i = 0; i < col; i++)
{
for (ll j = 0; j < row; j++)
{
cin >> graph[i][j];
if (graph[i][j] == 'M')
mindex.push_back({i, j});
if (graph[i][j] == 'A')
aindex.push_back({i, j});
}
}
/*for (ll i = 0; i < col; i++)
{
for (ll j = 0; j < row; j++)
{
// cout<<graph[i][j];
if (graph[i][j] == 'M')
bfsm(i, j);
else if (graph[i][j] == 'A')
{
bfs(i, j);
// cout<<dist[{i,j}]<<endl;
}
}
}*/
// for(auto it:mindex)bfsm(it.first,it.second);
bfsm();
for (auto it : aindex)
bfs(it.first, it.second);
for (ll i = 0; i < col; i += col - 1)
{
for (ll j = 0; j < row; j++)
{
// cout<<dist[{i, j}]<< " "<<dism[{i, j}]<<endl;
if ((dist[{i, j}] < dism[{i, j}]) || (dist[{i, j}] != 0 && dism[{i, j}] == 0))
{
vector<char> path;
path.push_back(pos[{i, j}]);
for (pair<ll, ll> k = parent[{i, j}];; k = parent[k])
{
if (k.first == -1)
break;
path.push_back(pos[k]);
}
cout << "YES\n";
cout << path.size() - 1 << endl;
for (ll i = path.size() - 2; i >= 0; i--)
cout << path[i];
return;
}
}
}
for (ll i = 1; i < col - 1; i++)
{
if ((dist[{i, 0}] < dism[{i, 0}]) || (dist[{i, 0}] != 0 && dism[{i, 0}] == 0))
{
vector<char> path;
path.push_back(pos[{i, 0}]);
for (pair<ll, ll> k = parent[{i, 0}];; k = parent[k])
{
if (k.first == -1)
break;
path.push_back(pos[k]);
}
cout << "YES\n";
cout << path.size() - 1 << endl;
for (ll i = path.size() - 2; i >= 0; i--)
cout << path[i];
return;
}
if ((dist[{i, row - 1}] < dism[{i, row - 1}]) || (dist[{i, row - 1}] != 0 && dism[{i, row - 1}] == 0))
{
vector<char> path;
path.push_back(pos[{i, row - 1}]);
for (pair<ll, ll> k = parent[{i, row - 1}];; k = parent[k])
{
if (k.first == -1)
break;
path.push_back(pos[k]);
}
cout << "YES\n";
cout << path.size() - 1 << endl;
for (ll i = path.size() - 2; i >= 0; i--)
cout << path[i];
return;
}
}
cout << "NO\n";
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n;
n = 1;
// cin >> n;
for (ll i = 1; i <= n; ++i)
{
// cout << "Case " << i << ": ";
solve();
}
return 0;
}