原题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