DFS代码
#include<iostream> #include<cstdio> using namespace std; #define Min(a,b) (a<b)?a:b const int MAX_N=205; const int INF=0x30303030; int floors[MAX_N]; int N, A, B; int step[MAX_N]; int dfs(int k) { if(k<1||k>N) return INF; if(step[k]!=-1) { return step[k]; } if(k==B) { return 0; } return step[k]=Min(dfs(k-floors[k])+1,dfs(k+floors[k])+1); } int main() { while(scanf("%d",&N)!=EOF&&N!=0) { scanf("%d %d",&A, &B); for(int i=1; i<=N; i++) { scanf("%d",&floors[i]); } memset(step,-1,sizeof(step)); int ans=dfs(A); if(ans>=INF) { printf("-1 "); } else { printf("%d ",ans); } } return 0; }
BFS:AC代码
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int MAX_N=205; const int INF=0x30303030; int floors[MAX_N]; int N, A, B; typedef pair<int, int> P; int vis[MAX_N]; int bfs() { memset(vis, 0, sizeof(vis)); queue<P> que; que.push(P(0,A)); vis[A]=1; while(!que.empty()) { P pos=que.front();que.pop(); int k=pos.second; int step=pos.first; if(k==B) { return step; } for(int i=-1; i<=1; i++) { int next=(k + i*floors[k]); if(next>=1&&next<=N&&!vis[next]) { vis[next]=1; que.push(P(step+1,next)); } } } return INF; } int main() { while(scanf("%d",&N)!=EOF&&N!=0) { scanf("%d %d",&A, &B); for(int i=1; i<=N; i++) { scanf("%d",&floors[i]); } int ans=bfs(); if(ans==INF) { printf("-1 "); } else { printf("%d ",ans); } } return 0; }