您的位置:首页 > 其它

ACM第二次练习—1013&1014

2016-04-19 22:42 239 查看
题意:在一个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;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: