P1135 奇怪的电梯
DFS写法
#include<bits/stdc++.h>
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 200+10;
int n,A,B;
int va[N];
int vis[N];
int dis[N];
int minn = 1e18;
void dfs(int now,int sum)
{
dis[now] = sum;
if(minn<=sum) return ;
if(sum>n) return ;
if(now==B)
{
minn = min(minn,sum);
return ;
}
int up = now+va[now];
int down = now-va[now];
if(up>=1&&up<=n&&vis[up]==0&&sum+1<dis[up])
{
vis[up] = 1;
dfs(up,sum+1);
vis[up] = 0;
}
if(down>=1&&down<=n&&vis[down]==0&&sum+1<dis[down])
{
vis[down] = 1;
dfs(down,sum+1);
vis[down] = 0;
}
}
signed main()
{
IOS;
cin>>n>>A>>B;
for(int i=1;i<=n;i++) cin>>va[i];
for(int i=1;i<=n;i++) dis[i] = 1e18;
dis[A] = 0;
vis[A] = 1;
dfs(A,0);
if(minn==1e18) minn = -1;
cout<<minn;
return 0;
}
BFS写法
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e3+5;
int n,sta,edb;
int va[N];
int dist[N];
int vis[N];
void bfs()
{
queue<int> q;
dist[sta] = 0;
vis[sta] = 1;
q.push(sta);
while(q.size()>=1)
{
auto now = q.front();
q.pop();
int up = now+va[now];
int down = now-va[now];
if(up>=1&&up<=n&&vis[up] ==0)
{
vis[up] = 1;
dist[up] = dist[now]+1;
q.push(up);
}
if(down>=1&&down<=n&&vis[down] ==0)
{
vis[down] = 1;
dist[down] = dist[now]+1;
q.push(down);
}
}
}
int main()
{
IOS;
cin>>n>>sta>>edb;
for(int i = 1;i<=n;i++) cin>>va[i];
bfs();
if(vis[edb] !=0)cout<<dist[edb];
else cout<<-1;
}