ACM第二次练习—1013&1014

题意:在一个N层高的楼有一个奇怪的电梯,在每一层只能上升或下降一个特定的层数,中间不会停止,在给定的条件下,问能不能到达指定楼层,可以到达的话返回转操作次数,不可以的话返回-1。

思路:这个题问能不能实现,所以用最快的速度找到可行解就可以,所以用广度优先搜索。

感想:第一道广搜题,有很多点不会。

代码:

#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
#include <cmath>  
#include <queue>  
#include <climits>  
  
using namespace std;  
  
const int MAX = 202;  
int flr[MAX],ans;  
int dist[MAX];  
int n,b;  
  
void dfs(int s,int cnt){  
    if(s>n || s<1)return;  
    if(s==b){  
        if(cnt<ans){  
            ans = cnt;  
            return;  
        }  
    }  
    if(cnt>=dist[s])return;  
    dist[s] = cnt;  
    dfs(s+flr[s],cnt+1);  
    dfs(s-flr[s],cnt+1);  
}  
  
int main(){  
    //freopen("in.txt","r",stdin);  
  
    int a,i,cnt;  
    while(scanf("%d",&n)!=EOF && n){  
        scanf("%d %d",&a,&b);  
        for(i=1;i<=n;++i){  
            scanf("%d",&flr[i]);  
            dist[i] = INT_MAX - 10;  
        }  
        cnt = 0;  
        ans = INT_MAX;  
        dfs(a,cnt);  
        if(ans==INT_MAX){  
            printf("-1\n");  
        }else{  
            printf("%d\n",ans);  
        }  
    }  
  
    return 0;  
}  

你可能感兴趣的:(ACM第二次练习—1013&1014)