有起点和终点,有方向,有最少次数,所以这道题很明显是一道bfs的题目,这题要利用vist数组来标记已走过的楼层,因为这题里面已走过的楼层是不可能在走第二遍的。
第二次走和第一次走的选择没有任何的区别。
#include"iostream" #include"stdio.h" #include"string.h" #include"algorithm" #include"cmath" #include"queue" #define mx 205 using namespace std; int n,a,b; int k[mx]; int vist[mx]; struct node { int x,times; friend bool operator<(node t1,node t2) { return t2.times<t1.times; } }; bool judge(int x) { if(x>=1&&x<=n&&!vist[x]) return true; return false; } void bfs() { node cur,next; int i; cur.x=a;cur.times=0; priority_queue<node>q; q.push(cur); while(!q.empty()) { cur=q.top(); q.pop(); if(cur.x==b){cout<<cur.times<<endl;return;} for(i=0;i<2;i++) { next.x=cur.x+pow(-1,i)*k[cur.x]; if(judge(next.x)) { next.times=cur.times+1; vist[next.x]=1; q.push(next); } } } cout<<-1<<endl; } int main() { while(cin>>n,n) { int i; cin>>a>>b; for(i=1;i<=n;i++) cin>>k[i]; memset(vist,0,sizeof(vist)); vist[a]=1;bfs(); } return 0; }
时间: 2024-10-14 06:00:46