http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目大意:第i层的电梯只能把人送到第i+K[i]层或第i-K[i]层;给定初始层数和目标层数,求最少雪瑶按几次开关才能从初始位置到目标位置。
简单bfs
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> #include <cmath> #include <queue> using namespace std; template <class T> void checkmin(T &t,T x) {if(x < t) t = x;} template <class T> void checkmax(T &t,T x) {if(x > t) t = x;} template <class T> void _checkmin(T &t,T x) {if(t==-1) t = x; if(x < t) t = x;} template <class T> void _checkmax(T &t,T x) {if(t==-1) t = x; if(x > t) t = x;} typedef pair <int,int> PII; typedef pair <double,double> PDD; typedef long long ll; #define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end ; it ++) using namespace std; const int N = 222; #define inf (1<<29) int dist[N]; bool vis[N]; int k[N]; struct Edge { int v , next; Edge () {} Edge(int v,int next) : v(v),next(next) {} }edge[N<<1]; int E , head[N]; void init() { E = 0; memset(head,-1,sizeof(head)); } void addedge(int u,int v) { edge[E] = Edge(v , head[u]); head[u] = E++; } int n , st , en; queue <int> q; void bfs() { for(int i=1;i<=n;i++) dist[i] = inf , vis[i] = 0; dist[st] = 0; while(!q.empty()) q.pop(); q.push(st); while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].v; if(dist[v] > dist[u] + 1) { dist[v] = dist[u] + 1; if(!vis[v]) { vis[v] = 1; q.push(v); } } } } } int main() { while(~scanf("%d",&n) && n) { scanf("%d%d",&st,&en); init(); for(int i=1;i<=n;i++) scanf("%d",&k[i]); for(int i=1;i<=n;i++) { int j = i + k[i]; if(j <= n) addedge(i , j); j = i - k[i]; if(j > 0) addedge(i , j); } bfs(); if(dist[en] == inf) puts("-1"); else printf("%d\n" , dist[en]); } return 0; }