洛谷Oj-奇怪的电梯-广度优先搜索

来源:互联网 发布:监测网络流量的软件 编辑:程序博客网 时间:2024/06/05 07:48

问题描述:
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
AC代码:

struct ele//加入队列后,很难知道当前是第几层,所以要特别设计这样的一个结构体{    int i;//当前第i层    int k;//可以向上(下)走k层    int cnt;//记录操作数};ele e[210];int book[500];//标记数组,对提高搜索效率很有帮助queue<ele> q;//队列int main(){    int n,a,b;    //输入    cin >> n >> a >> b;    for(int i = 1; i <= n; ++i)    {        e[i].i = i;//第i层        scanf("%d",&e[i].k);//可以上下k层    }    q.push(e[a]);//将第a层入队    book[a] = 1;//标记,防止之后再次走到第a层(又回到了解放前0.0)    while(!q.empty())//队列不为空    {        ele t = q.front();//访问队首元素        if(t.i == b)//如果队首是第b层,成功完成任务,输出操作次数        {            cout << t.cnt << endl;            return 0;//程序出口        }        if(t.i + t.k <= n && book[t.i + t.k] == 0)//可以向上走,别忘了判重!!!        {            e[t.i + t.k].cnt = t.cnt + 1;//操作数由第t.i层的操作数继承而来            q.push(e[t.i + t.k]);//入队            book[t.i + t.k] = 1;//标记        }        if(t.i - t.k >= 1 && book[t.i - t.k] == 0)//可以向下走        {            e[t.i - t.k].cnt = t.cnt + 1;//操作数由第t.i层的操作数继承而来            q.push(e[t.i - t.k]);//入队            book[t.i - t.k] = 1;//标记        }        q.pop();//出队    }    cout << -1 << endl;//无解    return 0;}

解决方法:
这道题一看到要求最小值,就觉得递推是用来计数的,怎么能用来求最优值呢?不太明白
类比到求最短路径,想到用广搜,思路特别地清晰,2A
改天复习的时候一定要去题解学习一下递推的方法,就酱

原创粉丝点击