hdu_1548 A strange lift

来源:互联网 发布:淘宝开虚拟充值网店 编辑:程序博客网 时间:2024/05/16 03:31

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548

分析:广度优先搜索。对满足条件的楼层入队列,第一次得到的目的楼层一定是最少次数到达的。

我的代码:

#include<stdio.h>#include<queue>#include<algorithm>using namespace std;struct Node{    int floor;  //楼层数    int k;      //在本楼可走的步数。    int num;};int n,s,e; //楼数,起始点,结束点。Node p[205];bool visited[205];queue<Node> Q;bool flag;int ans;void BFS(){    while(!Q.empty()) Q.pop();    p[s].num=0;    Q.push(p[s]);    visited[s]=1;    while(!Q.empty())    {        Node T=Q.front();        Q.pop();        if(T.floor==e)        {            flag=1;            ans=T.num;        }        int nfloor;        nfloor=T.floor+T.k;  //向上走        if(nfloor<=n&&!visited[nfloor]) //要先判断nfloor是否溢出,不然的话数组会越界。        {            visited[nfloor]=1;            p[nfloor].num=T.num+1;            Q.push(p[nfloor]);        }        nfloor=T.floor-T.k;  //向下走        if(nfloor>=1&&!visited[nfloor])        {            visited[nfloor]=1;            p[nfloor].num=T.num+1;            Q.push(p[nfloor]);        }    }}int main(){    while(~scanf("%d",&n)&&n)    {        scanf("%d%d",&s,&e);        int i;        for(i=1;i<=n;i++)        {            scanf("%d",&p[i].k);            p[i].floor=i;            p[i].num=0;            visited[i]=0;        }        flag=false;        BFS();        if(flag) printf("%d\n",ans);        else     printf("-1\n");    }    return 0;}

总结:开始时没有开visited数组,没有标志导致 Memory Limit Exceeded  -_-|||


原创粉丝点击