第一种方法用广度搜索。代码如下
#include <iostream>
#include <queue>
#include <memory.h>
#include <fstream>
using namespace std;
int N,A,B;
int cat[202],visit[202],dp[202];
int main()
{
//ifstream cin("in.txt");
while((cin >> N) && N)
{
cin >> A >> B;
memset(visit,0,sizeof(visit));
memset(dp,-1,sizeof(dp));
for(int i = 1;i <= N;i ++)
cin >> cat[i];
queue<int> q;
q.push(A);
dp[A] = 0;
while(!q.empty())
{
int x1 = q.front();
q.pop();visit[x1] = 1;
if(x1 == B) break;
if(x1 + cat[x1] >= 1 && x1 + cat[x1] <= N)
if(!visit[x1 + cat[x1]]){
q.push(x1 + cat[x1]);
dp[x1 + cat[x1]] = dp[x1] + 1;
visit[x1 + cat[x1]] = 1;
}
if(x1 - cat[x1] >= 1 && x1 - cat[x1] <= N)
if(!visit[x1 - cat[x1]]){
q.push(x1 - cat[x1]);
dp[x1 - cat[x1]] = dp[x1] + 1;
visit[x1 - cat[x1]] = 1;
}
}
cout << dp[B] << endl;
}
return 0;
}
但好像也可以用最短路去做,下面附一个网上的最短路的代码,供参考学习。
#include<iostream>
using namespace std;
#define INF 100000000
int map[205][205];
int dist[205],S[205];
int N,A,B;
int Dijkstra(int u,int v)
{
memset(S,0,sizeof(S));
int i,j,k;
for(i=1;i<=N;i++)
{
dist[i]=map[u][i];
}
S[u]=1;
dist[u]=0;
for(i=1;i<N;i++)
{
int min=INF,t;
for(j=1;j<=N;j++)
{
if(!S[j]&&dist[j]<min)
{
t=j;
min=dist[j];
}
}
if(min==INF)//说明不存在从A到B的任何路径
return -1;
if(t==v)//已到达B
return min;
S[t]=1;
for(k=1;k<=N;k++)
{
if(!S[k]&&dist[t]+map[t][k]<dist[k])
dist[k]=dist[t]+map[t][k];
}
}
return -1;
}
int main()
{
int i,j,c;
while(cin>>N,N)
{
cin>>A>>B;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
map[i][j]=i==j?0:INF;
}
for(i=1;i<=N;i++)
{
cin>>c;
if(i+c<=N)
map[i][i+c]=1;
if(i-c>=1)
map[i][i-c]=1;
}
if(A==B)//如果坑爹的题目问你从i到i就坑死了
{
cout<<"0"<<endl;
}
else
cout<<Dijkstra(A,B)<<endl;
}
return 0;
}