求助
查看原帖
求助
378467
Windy_YY楼主2022/10/22 08:10

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;
}

2022/10/22 08:10
加载中...