A strange lift BNUOJ 5746

来源:互联网 发布:ff14国服数据库 编辑:程序博客网 时间:2024/06/05 15:06

name: A strange lift
ID: BNUOJ 5746

这是一道BFS算法应用的经典入门题型。——最短路
相对DFS的“勇气”来说,BFS作为广度优先搜索,更加注重的是“谨慎”。
整体来说就是BFS最原本的应用,没有进行过多变化,但是有助于理解BFS本身。

思路:
1. 预处理,建立图的模型。把每一层能够到达的层数作为有边可以连接。
2. 使用队列实现BFS(而不必非是优先队列,因为每个点可以有至多两个通路方向,且步数同步)
3. 每次下一组测试数据输入时候,一定要把上次测试的数据清空(…浪费很久)

代码:

#include <cstdio>#include <queue>using namespace std;struct lift {    int up;    int down;    int dis;}g[210];int N, A, B;int w[210];const int INF = 10000;void prework(int size){   for(int j=1; j<=size; j++)   {       g[j].up = j + w[j];       g[j].down = j - w[j];       g[j].dis = INF;   }}void bfs(){   queue<lift> myLift;   myLift.push(g[A]);   while(!myLift.empty())    {        if(g[B].dis!=INF) return;        lift temp = myLift.front();        myLift.pop();        if(temp.up>=1 && temp.up<=N && g[temp.up].dis==INF)        {            g[temp.up].dis = temp.dis + 1;            myLift.push(g[temp.up]);        }        if(temp.down>=1 && temp.down<=N && g[temp.down].dis==INF)        {            g[temp.down].dis = temp.dis + 1;            myLift.push(g[temp.down]);        }    }}int main() {    scanf("%d", &N);    while(N!=0)    {        scanf("%d%d", &A, &B);        for(int i=1; i<=N; i++)           scanf("%d", &w[i]);        prework(N);        g[A].dis = 0;        bfs();        if(g[B].dis==INF)            printf("-1\n");        else            printf("%d\n", g[B].dis);        scanf("%d", &N);    }   return 0;}
0 0
原创粉丝点击