• HDU1548:A strange lift(Dijkstra或BFS)


    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=1548

    题意:电梯每层有一个数,例如第n层有个数k,

    那么这一层只能上k层或下k层,但是不能低于一层或高于n层,

    给定起点与终点,要求出最少要按几次键

    我的思路:这题可以用bfs或者用最短路(dijsktra)

    bfs

    AC代码

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;

    int n,a,b,dis[210],vis[210];

    struct node
    {
    int now;
    int step;
    };

    int main(void)
    {
    int bfs();
    int i;
    while(scanf("%d",&n)==1&&n)
    {
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&a,&b);
    for(i=1;i<=n;i++)
    scanf("%d",dis+i);
    printf("%d ",bfs());
    }
    return 0;
    }

    int bfs()
    {
    int i;
    queue<node> q;
    vis[a]=1;
    node start,next;
    start.now=a;
    start.step=0;
    q.push(start);
    while(!q.empty())
    {
    node s=q.front();
    q.pop();
    if(s.now==b)
    return s.step;
    for(i=0;i<2;i++)
    {
    if(0==i)
    next.now=s.now+dis[s.now];
    else
    next.now=s.now-dis[s.now];
    if(!vis[next.now]&&next.now>=1&&next.now<=n)
    {
    if(next.now==b)
    return s.step+1;
    vis[next.now]=1;
    next.step=s.step+1;
    q.push(next);
    }
    }
    }
    return -1;
    }

    最短路算法

    #include<stdio.h>
    #include<string.h>

    int n,a,b,dis[210],vis[210],map[210][210];
    const int Max = 0x3f3f3f3f;

    int main(void)
    {
    int i,j,k,l;
    while(scanf("%d",&n)==1&&n)
    {
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=n;j++)
    {
    if(i!=j)
    map[i][j]=Max;
    else
    map[i][j]=0;
    }
    }
    scanf("%d%d",&a,&b);
    for(i=1;i<=n;i++)
    {
    scanf("%d",dis+i);
    if(i-dis[i]>=1&&i+dis[i]<=n)
    map[i][i-dis[i]]=map[i][i+dis[i]]=1;
    else if(i-dis[i]>=1)
    map[i][i-dis[i]]=1;
    else
    map[i][i+dis[i]]=1;
    }
    for(i=1;i<=n;i++)
    dis[i]=map[a][i];
    for(i=1;i<=n;i++)
    {
    l=Max;
    for(j=1;j<=n;j++)
    {
    if(!vis[j]&&l>dis[j])
    {
    k=j;
    l=dis[j];
    }
    }
    if(l==Max) break;
    vis[k]=1;
    for(j=1;j<=n;j++)
    {
    if(!vis[j]&&dis[j]>dis[k]+map[k][j])
    dis[j]=dis[k]+map[k][j];
    }
    }
    if(dis[b]==Max)
    printf("-1 ");
    else
    printf("%d ",dis[b]);
    }
    return 0;
    }

  • 相关阅读:
    bzoj 2763: [JLOI2011]飞行路线
    2008年NOI全国竞赛 假面舞会
    八数码(双向宽搜)
    poj 1988 Cube Stacking && codevs 1540 银河英雄传说(加权并茶几)
    codevs 3693 数三角形
    bzoj 3831 Little Bird (单调队列优化dp)
    hdu 3530 Subsequence
    poj 2823 Sliding Window(单调队列)
    线段树各种小练习
    codevs 2449 骑士精神 (IDDfs)
  • 原文地址:https://www.cnblogs.com/liudehao/p/3914314.html
Copyright © 2020-2023  润新知