原题http://acm.hdu.edu.cn/showproblem.php?pid=1548
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11907 Accepted Submission(s): 4530
5 1 5 3 3 1 2 5 0
3
//BFS判断的时候要注意。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <limits.h> #include <ctype.h> #include <string.h> #include <string> #include <math.h> #include <algorithm> #include <iostream> #include <queue> #include <vector> #include <deque> #include <set> #include <map> using namespace std; #define MAXN 200 + 10 struct node{ //int vis; int step; int floor; //int fsum; }; int vis[MAXN]; int sum[MAXN]; int n,A,B; //queue<node>q; void BFS(){ //int i; int mark1,mark2; int flag = 0; //queue<node> q; node front,rear1,rear2; queue<node> q; front.step = 0; front.floor = A; //front.fsum = sum[A]; vis[A] = 1; q.push(front); while(!q.empty()){ front = q.front(); q.pop(); if(front.floor == B){ flag = 1; printf("%d\n",front.step); break; } mark1 = front.floor+sum[front.floor]; mark2 = front.floor-sum[front.floor]; if((mark1>=1&&mark1<=n) && (vis[mark1]==0)){ rear1.floor = mark1; vis[mark1] = 1; //rear1.vis = 1; //rear1.fsum = sum[mark1]; rear1.step = front.step+1; q.push(rear1); } //mark = front.floor - front.sum; if((mark2>=1&&mark2<=n) && (vis[mark2]==0)){ rear2.floor = mark2; //rear2.vis = 1; vis[mark2] = 1; //rear2.fsum = sum[mark2]; rear2.step = front.step+1; q.push(rear2); } } if(flag == 0){ printf("-1\n"); } } int main(){ int i; while(~scanf("%d",&n)){ if(n == 0){ break; } scanf("%d%d",&A,&B); //memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); memset(sum,0,sizeof(sum)); for(i=1;i<=n;i++){ scanf("%d",&sum[i]); } BFS(); } return 0; }
原文地址:http://blog.csdn.net/zcr_7/article/details/39002529