哭了只有50分 求大佬帮一帮
查看原帖
哭了只有50分 求大佬帮一帮
555116
Xuan1111楼主2021/10/7 15:12
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stdio.h>
using namespace std;
const int N=210;
int head[N],e[N],ne[N],idx=0;//存着每个点可以到达的地方  idx就是没什么用的
int n,A,B;
bool ju[N];

//直接用图搜就行   从A开始搜到B
void add(int a,int b)//创建邻接链表  我透head表示的是头节点的下标
{
//向以a为为头的链表插head   表示
e[idx]=b;//就是头插啊
ne[idx]=head[a];
head[a]=idx++;
}
int dfs (int a,int b)
{
int sum=0;
int i;
if(a==b) return 0;
queue <int> q;
q.push(a);
ju[a]=true;
while(q.size())
{
int j=q.front();
q.pop();
for(i=head[j];i!=-1;i=ne[i])//下标用ne来表示  从头节点开始遍历
{
if(!ju[e[i]])
{
ju[e[i]]=true;
sum++;
if(e[i]==b)break;
q.push(e[i]);
}
}
}
if(e[i]!=b) return -1;
else return sum;
}
int main()
{   int num;
    memset(head, -1, sizeof head);
    memset(ju, false,sizeof ju);
	scanf("%d %d %d",&n,&A,&B);//从A楼到b楼   直接从A开始(不是一定要从1l开始)  再搜下一次 两次bfs 第一次先搜到上楼的最短路   第二次从这开始搜
    for(int i=1;i<=n;i++)//每一楼可以到大地点
    {
    cin>>num;
    if(i+num<=n) add(i,i+num);
    if(i-num>0)  add(i,i-num);
    }
    cout<<dfs(A,B)<<endl;
    // cout<<idx;
    system("pause");
    return 0;
}```
2021/10/7 15:12
加载中...