標籤:
DFS代碼
#include<iostream>#include<cstdio>using namespace std;#define Min(a,b) (a<b)?a:bconst 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\n"); } else { printf("%d\n",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\n"); } else { printf("%d\n",ans); } } return 0;}
HDOJ1548(DFS超記憶體,BFS過了)