rt
有没有什么不用bfs的方法
#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
int dis[N];
bool vis[N];
signed main()
{
int x, y, z;
cin >> x >> y >> z;
x += 1001, y += 1001, z += 1001;
queue <int> q;
q.push(1001);
vis[1001] = true;
dis[1001] = 0;
int dis1 = -1;
while (q.size())
{
int f = q.front();
q.pop();
if (f == x)
{
dis1 = dis[f];
goto ee;
}
int dx[] = {1, -1};
for (int i = 0; i < 2; i ++)
{
int nx = f + dx[i];
if (nx > 2002 || nx < 0)
continue ;
if (nx == y || vis[nx])
continue ;
vis[nx] = true;
dis[nx] = dis[f] + 1;
q.push(nx);
}
}
ee:;
int dis2 = -1;
memset (dis, 0, sizeof dis);
memset (vis, false, sizeof vis);
while (q.size())
q.pop();
q.push(1001);
dis[1001] = 0;
vis[1001] = true;
while (q.size())
{
int f = q.front();
q.pop();
if (f == z)
{
dis2 = dis[f];
goto ff;
}
int dx[] = {1, -1};
for (int i = 0; i < 2; i ++)
{
int nx = f + dx[i];
if (nx > 2002 || nx < 0)
continue ;
if (nx == y || vis[nx])
continue ;
vis[nx] = true;
dis[nx] = dis[f] + 1;
q.push(nx);
}
}
ff:;
int yz = z - x;
if (yz < 0)
yz = -yz;
if (dis2 != -1)
dis2 += yz;
if (dis1 + dis2 == -2)
cout << "-1\n";
else if (dis1 == -1)
cout << dis2 << '\n';
else if (dis2 == -1)
cout << dis1 << '\n';
else
cout << min(dis1, dis2) << '\n';
return 0;
}