http://acm.hdu.edu.cn/showproblem.php?pid=1548
题解:
图广搜变形,其实就两个方向,dir[2]={-1,1},ni=out.i+dir[t]*a[out.i],ni是下一步能到达的层数,out.i是当前层的层数,dir[t]是方向,a[out.i]是当前层数的Ki值。
代码:
#include<cstdio> #include<queue> #include<cstring> using namespace std; int N; int a[201]; int visit[201]; int dir[2]={-1,1}; struct P { int i; int step; }; int BFS(int A,int B) { memset(visit,0,sizeof(visit)); queue<P>que; P start={A,0}; que.push(start); while(!que.empty()) { P out; out=que.front(); que.pop(); if(out.i==B) return out.step; int t; for(t=0;t<2;t++) { int ni; ni=out.i+dir[t]*a[out.i]; if(ni>=1&&ni<=N&&!visit[ni]) { visit[ni]=1; P find={ni,out.step+1}; que.push(find); } } } return -1; } int main() { while(~scanf("%d",&N)) { int A,B; if(N==0) return 0; scanf("%d%d",&A,&B); int i; for(i=1;i<=N;i++) { scanf("%d",&a[i]); } int ans=BFS(A,B); printf("%d\n",ans); } return 0; }
HDU 1548 A strange lift(BFS),布布扣,bubuko.com
原文:http://blog.csdn.net/yl_freedom/article/details/21791429