zoukankan      html  css  js  c++  java
  • 集训作业 洛谷P1135 奇怪的电梯

    这个题我见过!!!

    我之前在石油大学的网站上做练习赛,提高了很多,这个题是我第一次在比赛里见到深搜。

    当时蒙蔽的一批,现在发现好简单……

    这个题和普通的深搜没什么区别,甚至可以说简单了,因为这个是1维的,别的是二维的(见到老熟人,我快高兴疯了)。

    我们先来个代码吧,解释什么的写进注释里了:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long a,b,n;
    long long k[300];
    long long t,w,bj2=0;
    long long sz[1000],bs[1000],bj[300];//不想用queue,就用数组了
    void bfs()
    {
    	while(w<=t)
    	{
    		if(sz[w]==b)//到地方了,输出一下用了多少步
    		{
    			bj2=1;//是可以到达目的地的
    			cout<<bs[w]<<endl;
    			return;
    		}
    		if(sz[w]+k[sz[w]]<=n&&bj[sz[w]+k[sz[w]]]==0)//向上移动,并且到达的楼层没来过,而且不会飞出去。
    		{
    			t++;
    			sz[t]=sz[w]+k[sz[w]];//加一个新楼层
    			bs[t]=bs[w]+1;//来这层楼用了几步
    			bj[sz[w]+k[sz[w]]]=1;//现在来过了
    		}
    		if(sz[w]-k[sz[w]]>=1&&bj[sz[w]-k[sz[w]]]==0)//向下移动,并且到达的楼层没来过,而且不会进入地下室
    		{
    			t++;
    			sz[t]=sz[w]-k[sz[w]];//加进来一个新楼层
    			bs[t]=bs[w]+1;//来这层楼用了几步
    			bj[sz[w]-k[sz[w]]]=1;//现在来过了
    		}
    		w++;
    	}
    }
    int main()
    {
    	scanf("%lld%lld%lld",&n,&a,&b);
    	sz[t]=a;//初始在第a层
    	bs[t]=0;//不需要移动
    	bj[a]=1;//第a层来过了
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%lld",&k[i]);//输入
    	}
    	bfs();//搜索
    	if(bj2==0)//如果到达不了目的地,输出-1;
    	{
    		cout<<-1<<endl;
    	}
    	return 0;	
    }
    

    是不是简单的不能再简单了,真是个良心题。

  • 相关阅读:
    NOI2013 树的计数
    拆系数FFT学习笔记
    HAOI2017 八纵八横——线段树分治+线性基
    BJOI2018链上二次求和——线段树
    [bzoj3514]Codechef MARCH14 GERALD07加强版——lct+主席树
    KD-Tree 学习笔记
    SDOI2010 捉迷藏 —— KD-Tree
    HAOI2018染色——容斥
    gitignore 不起作用的解决办法
    reids学习教程
  • 原文地址:https://www.cnblogs.com/lichangjian/p/12888686.html
Copyright © 2011-2022 走看看