HDU 1548 A strange lift

来源:互联网 发布:电影票房数据分析 编辑:程序博客网 时间:2024/06/05 14:56

代码bfs:

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;int n,A,B;int lift[205];bool vis[205];int step[1005],loc[1005];queue<int> q;bool dis(int x){    if(x>=1&&x<=n)        return true;    return false;}int BFS(){    int front,tail;    front=tail=0;    loc[front++]=A;    int up,down;    while(front>tail)    {        int x=loc[tail++];     //   cout<<x<<endl;        if(x==B) break;        up=x+lift[x];        down=x-lift[x];        if(!vis[up]&&dis(up))        {            vis[up]=true;            loc[front++]=up;            step[up]=step[x]+1;        }        if(!vis[down]&&dis(down))        {            vis[down]=true;            loc[front++]=down;            step[down]=step[x]+1;        }    }    return step[B];}int main(){    while(scanf("%d",&n)!=EOF&&n)    {        scanf("%d%d",&A,&B);        memset(lift,0,sizeof(lift));        int i,j;        for(i=1;i<=n;i++)        {            scanf("%d",&lift[i]);            vis[i]=false;            step[i]=0;        }        if(A==B) printf("0\n");        else        {            int ans=BFS();            if(ans==0) printf("-1\n");            else            {                printf("%d\n",ans);            }        }    }    return 0;}

代码 Dijskra:

#include <iostream>#include <cstdio>#include <cstring>#define INF 0x7ffffusing namespace std;int n,A,B;int dp[205][205];int lift[205],dis[10005];bool vis[10005];void Dij(){    int i;    for(i=0;i<=n;i++)    {        dis[i]=dp[A][i];      //  cout<<dis[i]<<endl;        vis[i]=true;    }    vis[A]=false;    dis[A]=0;    int min,k;    for(i=1;i<=n;i++)    {        min=INF;        for(int j=1;j<=n;j++)        {            if(vis[j]&&min>dis[j])            {                min=dis[j];                k=j;            }        }        if(min==INF) break;        vis[k]=false;        for(int j=1;j<=n;j++)        {            if(vis[j]&&dis[k]+dp[k][j]<dis[j])            {                dis[j]=dis[k]+dp[k][j];            }        }    }}int main(){    while(scanf("%d",&n)!=EOF&&n)    {        scanf("%d%d",&A,&B);        int i,j;        for(i=0;i<=n;i++)            for(j=0;j<=n;j++)            dp[i][j]=INF;        for(i=1;i<=n;i++)        {            scanf("%d",&lift[i]);            if(i-lift[i]>0) dp[i][i-lift[i]]=1;            if(i+lift[i]<=n) dp[i][i+lift[i]]=1;        }        Dij();        if(dis[B]==INF) printf("-1\n");        else            printf("%d\n",dis[B]);    }    return 0;}



原创粉丝点击