丰富多彩的结果
#include <iostream>
#include <algorithm>
#include <vector>
#define x first
#define y second
using namespace std;
const int dx[17] = { 0, 0, 1, 0, -1 }, dy[17] = { 0, 1, 0, -1, 0 };
struct node
{
int p, q;
char symbol;
};
int n, m, ans = 0x7fffffff;
char a[307][307];
pair<int, int> s[307][307];
int vis[307][307], dr[37];
pair<int, int> fs, st;
vector< node > pr;
void dfs(int p, int q, int curr)
{
if (p == fs.x && q == fs.y)
{
ans = min(ans, curr);
return;
}
if ((s[p][q].x != 0 || s[p][q].y != 0) && !dr[a[p][q] - 'A' + 1])
{
dr[a[p][q] - 'A' + 1] = 1;
vis[s[p][q].x][s[p][q].y] = 1;
dfs(s[p][q].x, s[p][q].y, curr);
vis[s[p][q].x][s[p][q].y] = 0;
}
for (int i = 1; i <= 4; ++i)
{
int dirx = p + dx[i];
int diry = q + dy[i];
if (dirx >= 1 && diry >= 0 && dirx <= n && diry < m && !vis[dirx][diry] && a[dirx][diry] != '#')
{
vis[dirx][diry] = 1;
dfs(dirx, diry, curr + 1);
vis[dirx][diry] = 0;
}
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
for (int j = 0; j < m; ++j)
{
if (a[i][j] >= 'A' && a[i][j] <= 'Z')
{
pr.push_back({i, j, a[i][j]});
int k;
for (k = 0; k < pr.size() - 1; ++k)
if (pr[k].symbol == pr[pr.size() - 1].symbol)
break;
if (k != pr.size() - 1)
{
s[pr[k].p][pr[k].q] = make_pair(i, j);
s[i][j] = make_pair(pr[k].p, pr[k].q);
}
}
if (a[i][j] == '=') fs = make_pair(i, j);
if (a[i][j] == '@') st = make_pair(i, j);
}
}
vis[st.x][st.y] = 1;
dfs(st.x, st.y, 0);
cout << ans << endl;
return 0;
}