1、通过erase删除方向,让原本很复杂的代码变得简洁。
2、通过return两个不同类型的答案,使得代码量变得更少。
3、通过bfs将状态转移给后面。
4、这种集成的技巧,根据相同点把不同类的代码组合成一个函数,这种技巧是需要学习的。
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
cout<<fixed<<setprecision(15);
int n, m, i, j;
cin>>n>>m;
vector a(n+2, vector<int>(m+2, 2));
for (i=1; i<=n; i++)
{
string s;
cin>>s;
for (j=1; j<=m; j++) a[i][j]=s[j-1]=='X';
}
auto bfs=[&](vector<int> dx, vector<int> dy)
{
vector dis(2, vector(n+1, vector<int>(m+1, inf)));
dis[0][1][1]=0;
queue<tuple<int, int, int>> q;
q.push({0, 1, 1});
int c=dx.size(), i, j;
while (q.size())
{
auto [o, x, y]=q.front(); q.pop();
for (i=0; i<c; i++)
{
int nx=x+dx[i], ny=y+dy[i], oo=o+a[nx][ny];
if (oo<=1&&dis[oo][nx][ny]==inf)
{
dis[oo][nx][ny]=dis[o][x][y]+1;
q.push({oo, nx, ny});
}
}
}
return pair{dis[0][n][m], dis[1][n][m]};
};
vector<int> dx={1, 0, -1, 0}, dy={0, 1, 0, -1};
int ans=inf;
cmin(ans, bfs(dx, dy).first);
for (int i=0; i<4; i++)
{
auto x=dx, y=dy;
x.erase(x.begin()+i);
y.erase(y.begin()+i);
cmin(ans, bfs(x, y).second);
}
if (ans==inf) ans=-1;
cout<<ans<<endl;
}